- 浏览: 890643 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (687)
- java (127)
- servlet (38)
- struts (16)
- spring (22)
- hibernate (40)
- javascript (58)
- jquery (18)
- tomcat (51)
- 设计模式 (6)
- EJB (13)
- jsp (3)
- oracle (29)
- RUP (2)
- ajax (3)
- java内存管理 (4)
- java线程 (12)
- socket (13)
- path (5)
- XML (10)
- swing (2)
- UML (1)
- JBPM (2)
- 开发笔记 (45)
- Note参考 (15)
- JAXB (4)
- Quartz (2)
- 乱码 (2)
- CSS (2)
- Exception (4)
- Tools (7)
- sqlserver (3)
- DWR (7)
- Struts2 (47)
- WebService (2)
- 问题解决收藏 (7)
- JBOSS (7)
- cache (10)
- easyUI (19)
- jQuery Plugin (11)
- FreeMarker (6)
- Eclipse (2)
- Compass (2)
- JPA (1)
- WebLogic (1)
- powerdesigner (1)
- mybatis (1)
最新评论
-
bugyun:
受教了,谢谢
java 正则表达式 过滤html标签 -
xiongxingxing_123:
学习了,感谢了
java 正则表达式 过滤html标签 -
wanmeinange:
那如果无状态的。对同一个任务并发控制怎么做?比如继承Quart ...
quartz中参数misfireThreshold的详解 -
fanjieshanghai:
...
XPath 元素及属性查找 -
tianhandigeng:
还是没明白
quartz中参数misfireThreshold的详解
from http://blog.csdn.net/Icandoeverything/archive/2009/03/19/4005535.aspx
用JDBC给存储过程传递数组类型的参数 收藏
A . 嵌套表
1. 声明数组类型
create or replace type tab_array is table of varchar2(38);暂时不要在包中声明该类型
2. 创建存储过程
-- 该例子存储过程是在包中创建的,包名 arraydemo
procedure testArray(resNumber in tab_array,procResult out tab_array) is
begin
procResult := new tab_array();
for i in 1..resNumber.Count loop
procResult.EXTEND;
procResult(i) := resNumber(i) || 'lucifer' || i;
end loop;
end;
3. Java调用代码
//必须使用Oracle的连接和Statement,使用了连接池的必须通过一些方法获取原始的连接
OracleConnection conn = null;
OracleCallableStatement stmt = null;
String[] param = { "1001", "1002", "1006" };
stmt =(转换类型) conn.prepareCall("{call arraydemo.testArray(?,?)}");
// 类型名必须大写
ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("TAB_ARRAY", conn);
stmt.setARRAY(1, new ARRAY(descriptor,conn,param));
stmt.registerOutParameter(2, OracleTypes.ARRAY, "TAB_ARRAY");
stmt.execute();
ARRAY array = stmt.getARRAY(2);
Datum[] data = array.getOracleArray();
for (int i = 0; i < data.length; i++) {
System.out.println(i + " : " + new String(data.shareBytes()));
}
4 . 注意的问题及尚未解决的问题
抛出:Non supported character set: oracle-character-set-852 异常---解决:添加 nls_charset12.jar 到classpath,该包在oracle/ora92/jdbc/lib目录下
待解决问题:
a) 如何调用在包声明的自定义类型
b) 比较不同声明类型的优缺点,及使用场合
嵌套表其它应用:http://zhouwf0726.itpub.net/post/9689/212253
例程:
import java.sql.*;
public class DBDeclareTest{
private Connection con = null;// 数据库连接
private java.sql.CallableStatement cs = null;//执行存储过程的接口
private int key;
private String name;
//在构造函数中构造连接
public DBDeclareTest(){
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
con = DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=pubs","sa","");
System.out.println ("con ok");
}
catch (Exception ex) {
ex.printStackTrace();
}
}
//调用无返回值的存储过程
public void getOK1(){
try {
String sql="{call pro_mypro1(?,?)}";
cs = con.prepareCall(sql);
cs.setInt(1,key);
cs.setString(2,name);
cs.executeUpdate();
System.out.println ("执行成功,可以休息了。。。。");
cs.close();
con.close();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
//调用有返回值的存储过程
public void getOK2(){
try {
String sql = "{call pro_mypro2(?,?)}";
cs = con.prepareCall(sql);
//设置output外部传参
cs.registerOutParameter(1,java.sql.Types.BIT);
cs.setString(2,name);
cs.execute();
//获得output外部传参的值
int numOut = cs.getInt(1);
if(numOut ==1){
System.out.println ("数据表存在");
}else{
System.out.println ("数据表不存在!!!");
}
cs.close();
con.close();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
//返回结果集的存储过程
public void getOK3(){
try {
String sql = "{call pro_mypro3(?,?)}";
cs = con.prepareCall(sql);
//设置output外部传参
cs.registerOutParameter(1,java.sql.Types.BIT);
cs.setString(2,name);
boolean flag = cs.execute();
System.out.println (flag);
if(flag){
System.out.println ("OKOKOKO");
ResultSet rs = cs.getResultSet();
ResultSetMetaData rsmd =rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();
while(rs.next()){
for(int i=0;i<numberOfColumns;i++)
{
System.out.println (rsmd.getColumnName(i)+" ");
System.out.println (rs.getObject(i)+" ");
}
}
}else
{
System.out.println ("表名不存在:"+cs.getBoolean(1));
}
cs.close();
con.close();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
public void setKey(int k){
this.key = k;
}
public int getKey(){
return this.key;
}
public void setName(String n){
this.name = n;
}
public String getName(){
return this.name;
}
}
用JDBC给存储过程传递数组类型的参数 收藏
A . 嵌套表
1. 声明数组类型
create or replace type tab_array is table of varchar2(38);暂时不要在包中声明该类型
2. 创建存储过程
-- 该例子存储过程是在包中创建的,包名 arraydemo
procedure testArray(resNumber in tab_array,procResult out tab_array) is
begin
procResult := new tab_array();
for i in 1..resNumber.Count loop
procResult.EXTEND;
procResult(i) := resNumber(i) || 'lucifer' || i;
end loop;
end;
3. Java调用代码
//必须使用Oracle的连接和Statement,使用了连接池的必须通过一些方法获取原始的连接
OracleConnection conn = null;
OracleCallableStatement stmt = null;
String[] param = { "1001", "1002", "1006" };
stmt =(转换类型) conn.prepareCall("{call arraydemo.testArray(?,?)}");
// 类型名必须大写
ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("TAB_ARRAY", conn);
stmt.setARRAY(1, new ARRAY(descriptor,conn,param));
stmt.registerOutParameter(2, OracleTypes.ARRAY, "TAB_ARRAY");
stmt.execute();
ARRAY array = stmt.getARRAY(2);
Datum[] data = array.getOracleArray();
for (int i = 0; i < data.length; i++) {
System.out.println(i + " : " + new String(data.shareBytes()));
}
4 . 注意的问题及尚未解决的问题
抛出:Non supported character set: oracle-character-set-852 异常---解决:添加 nls_charset12.jar 到classpath,该包在oracle/ora92/jdbc/lib目录下
待解决问题:
a) 如何调用在包声明的自定义类型
b) 比较不同声明类型的优缺点,及使用场合
嵌套表其它应用:http://zhouwf0726.itpub.net/post/9689/212253
例程:
import java.sql.*;
public class DBDeclareTest{
private Connection con = null;// 数据库连接
private java.sql.CallableStatement cs = null;//执行存储过程的接口
private int key;
private String name;
//在构造函数中构造连接
public DBDeclareTest(){
try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
con = DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=pubs","sa","");
System.out.println ("con ok");
}
catch (Exception ex) {
ex.printStackTrace();
}
}
//调用无返回值的存储过程
public void getOK1(){
try {
String sql="{call pro_mypro1(?,?)}";
cs = con.prepareCall(sql);
cs.setInt(1,key);
cs.setString(2,name);
cs.executeUpdate();
System.out.println ("执行成功,可以休息了。。。。");
cs.close();
con.close();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
//调用有返回值的存储过程
public void getOK2(){
try {
String sql = "{call pro_mypro2(?,?)}";
cs = con.prepareCall(sql);
//设置output外部传参
cs.registerOutParameter(1,java.sql.Types.BIT);
cs.setString(2,name);
cs.execute();
//获得output外部传参的值
int numOut = cs.getInt(1);
if(numOut ==1){
System.out.println ("数据表存在");
}else{
System.out.println ("数据表不存在!!!");
}
cs.close();
con.close();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
//返回结果集的存储过程
public void getOK3(){
try {
String sql = "{call pro_mypro3(?,?)}";
cs = con.prepareCall(sql);
//设置output外部传参
cs.registerOutParameter(1,java.sql.Types.BIT);
cs.setString(2,name);
boolean flag = cs.execute();
System.out.println (flag);
if(flag){
System.out.println ("OKOKOKO");
ResultSet rs = cs.getResultSet();
ResultSetMetaData rsmd =rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();
while(rs.next()){
for(int i=0;i<numberOfColumns;i++)
{
System.out.println (rsmd.getColumnName(i)+" ");
System.out.println (rs.getObject(i)+" ");
}
}
}else
{
System.out.println ("表名不存在:"+cs.getBoolean(1));
}
cs.close();
con.close();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
public void setKey(int k){
this.key = k;
}
public int getKey(){
return this.key;
}
public void setName(String n){
this.name = n;
}
public String getName(){
return this.name;
}
}
发表评论
文章已被作者锁定,不允许评论。
-
操作系统的目标和作用
2012-07-05 23:46 1326操作系统的目标 目前存在着多种类型的OS,不同类型的OS ... -
利用(ffmpeg)生成视频缩略图(java)
2012-07-01 01:11 0对于上传视频生成缩略图使用的是ffmpeg进行生成的。 自己在 ... -
对Java多线程技术中所有方法的详细解析
2012-06-06 11:32 784一、run()和start() 这两个 ... -
java乱码
2012-06-06 11:33 968自从接触Java和JSP以来, ... -
学习apache commons-io类库中的文件清除器
2011-07-06 23:26 1439学习apache commons-io 1.4类库中的File ... -
java 正则表达式 过滤html标签
2011-05-24 15:10 5352前段时间开发的时候要读取一篇文章的简介内容(也就是前200个字 ... -
转---Eclipse中web-inf和meta-inf文件夹的信息
2011-05-24 13:08 1131Eclipse中web-inf和meta-inf ... -
logback与Log4J的区别
2011-05-17 23:34 1432Logback和log4j是非常相似 ... -
性能优化
2011-04-14 16:10 1174(1)jdbc性能优化 jdbc程序的性能主要由两个因素决定 ... -
JAVA的Random类(转)
2011-04-12 00:21 908Random类中实现的随机算法是伪随机,也就是有规则的随机。在 ... -
非阻塞的Socket链接
2011-04-10 21:59 890import java.io.IOException; ... -
创建临时文件
2011-04-10 21:55 1091package net.java2000.io; ... -
面向对象设计的基本原则
2011-04-07 10:28 1143摘自:http://soft6.com/tech/6/6501 ... -
proxool
2011-04-02 15:01 855属性列表说明: fatal-sql- ... -
当前Java软件开发中几种认识误区
2011-04-01 10:12 876越来越多人开始使用Java ... -
Java中查看一个方法被调用的层次(Reflection、StackTrace)
2011-04-01 00:53 2032package test; public class Mai ... -
反序列化时恢复transient字段
2011-03-30 13:20 1212我们知道将字段设置为transient,可以避免该自动被序列化 ... -
用socket连接服务器直接发送接收邮件
2011-03-22 17:22 1301首页 新闻 论坛 问答 博客 招聘 更多 ▼ 专栏 &l ... -
利用JavaMail收/发Gmail邮件(SSL)
2011-03-22 17:21 2386Gmail目前已经启用了POP3和SMTP服务,具体情况请看 ... -
Java 反射与内省
2011-03-14 22:08 1073一、java反射机制 JAVA反 ...
相关推荐
在Java中,尤其是使用Spring框架时,我们可以借助JDBC或ORM(对象关系映射)工具如Hibernate来调用这些存储过程。 在Spring中,调用存储过程通常通过`JdbcTemplate`或`NamedParameterJdbcTemplate`类来实现。对于...
在Oracle数据库环境中,有时我们需要通过存储过程传递数组参数来处理批量数据。然而,在实际操作中,我们可能会遇到一个问题,那就是如何正确地处理数组中的空值(NULL)或空元素。"oracle class12.jar nls_charset...
总结来说,本文详细讲解了如何在MyBatis中调用PostgreSQL的存储过程,特别是如何处理数组类型的输入参数。通过自定义`TypeHandler`,我们可以使MyBatis与PostgreSQL的数组类型无缝对接,实现高效、准确的数据操作。
jdbc执行存储过程jdbc执行存储过程jdbc执行存储过程
4. **设置参数**:根据存储过程的需求设置输入参数,使用`setXXX()`方法,其中XXX代表参数类型(如`setInt()`, `setString()`, `setBoolean()`等)。这些方法的索引从1开始。 ```java cs.setInt(1, param1); cs....
本篇文章将详细探讨如何使用JDBC来访问SQL Server数据库中的存储过程,这对于开发涉及数据库操作的应用程序至关重要。 首先,我们需要理解存储过程的概念。存储过程是预编译的SQL语句集合,存储在数据库服务器中,...
本文将详细讲解如何使用JDBC来调用存储过程,以实现数据的增删改查操作。 首先,理解存储过程是数据库中的一个重要概念。存储过程是一组预先编译好的SQL语句集合,它可以包含控制流语句、输入/输出参数,甚至可以有...
在这个例子中,`my_procedure`是存储过程名,`123`是传递给存储过程的`IN`参数,而`OUT`参数是一个字符串类型,我们使用`getString()`方法读取。 请注意,不同的数据库可能需要不同的JDBC驱动和特定的语法。上述...
在Java中调用这个存储过程,我们需要使用JDBC的CallableStatement接口,并指定Oracle的ARRAY类型作为输出参数。以下是一个简单的示例: ```java import oracle.jdbc.OracleConnection; import oracle.jdbc.Oracle...
3. 设置参数:如果存储过程有输入或输出参数,使用`CallableStatement.registerOutParameter()`注册输出参数,并使用`setXXX()`方法设置输入参数,其中XXX代表Java数据类型。 4. 执行存储过程:调用`...
本文将深入探讨如何使用JDBC调用Oracle数据库的存储过程来实现增删改查操作。 首先,理解JDBC是Java与各种数据库交互的桥梁,它提供了一组API,允许程序员执行SQL语句并处理结果。Oracle数据库则是一种广泛使用的...
总的来说,使用JDBC操作Oracle的存储过程返回值涉及了JDBC的基本操作,包括加载驱动、建立连接、创建CallableStatement、设置参数、执行存储过程、获取返回值以及释放资源。理解这些步骤对于开发与Oracle数据库交互...
Java程序员可以使用`CallableStatement`接口来执行存储过程,它允许我们传递参数并接收结果。存储过程可以提高性能,减少网络通信,同时提供封装和重用的特性。 接着,**JDBC创建表** 涉及到使用`Statement`或`...
在处理数组参数时,Oracle提供了PL/SQL TABLE类型的参数,Java可以通过数组或Java Collection类型传递。在返回集合时,可以将结果集映射到Java集合对象,如ArrayList或自定义的实体类,这样可以更好地适应业务需求。...
如果存储过程有输出参数,可以使用`getXXX`方法获取结果: ```java int outputValue = cs.getInt(2); ``` #### 步骤6:关闭资源 最后,记得关闭CallableStatement和Connection: ```java cs.close(); conn.close...
在JDBC中调用存储过程通常涉及以下步骤: 1. 加载并注册数据库驱动,建立数据库连接。 2. 创建CallableStatement对象,它继承自PreparedStatement,专门用于调用数据库的存储过程。 3. 使用CallableStatement的`{}`...
2. 设置参数:根据存储过程的输入参数类型,调用`setXXX()`方法设置参数值,例如`cs.setInt(1, param1)`。 3. 执行存储过程:调用CallableStatement的`execute()`方法执行存储过程。 4. 处理结果:如果存储过程有...