`

用JDBC给存储过程传递数组类型的参数 zz

    博客分类:
  • java
阅读更多
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;
}

}
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Spring访问传入数组参数的Oracle存储过程

    在Java中,尤其是使用Spring框架时,我们可以借助JDBC或ORM(对象关系映射)工具如Hibernate来调用这些存储过程。 在Spring中,调用存储过程通常通过`JdbcTemplate`或`NamedParameterJdbcTemplate`类来实现。对于...

    oracle class12.jar nls_charset12.jar存储过程接收数组空值

    在Oracle数据库环境中,有时我们需要通过存储过程传递数组参数来处理批量数据。然而,在实际操作中,我们可能会遇到一个问题,那就是如何正确地处理数组中的空值(NULL)或空元素。"oracle class12.jar nls_charset...

    Mybatis调用PostgreSQL存储过程实现数组入参传递

    总结来说,本文详细讲解了如何在MyBatis中调用PostgreSQL的存储过程,特别是如何处理数组类型的输入参数。通过自定义`TypeHandler`,我们可以使MyBatis与PostgreSQL的数组类型无缝对接,实现高效、准确的数据操作。

    jdbc执行存储过程

    jdbc执行存储过程jdbc执行存储过程jdbc执行存储过程

    JDBC 调用存储过程方法

    4. **设置参数**:根据存储过程的需求设置输入参数,使用`setXXX()`方法,其中XXX代表参数类型(如`setInt()`, `setString()`, `setBoolean()`等)。这些方法的索引从1开始。 ```java cs.setInt(1, param1); cs....

    用JDBC访问存储过程

    本篇文章将详细探讨如何使用JDBC来访问SQL Server数据库中的存储过程,这对于开发涉及数据库操作的应用程序至关重要。 首先,我们需要理解存储过程的概念。存储过程是预编译的SQL语句集合,存储在数据库服务器中,...

    JDBC调用存储过程

    本文将详细讲解如何使用JDBC来调用存储过程,以实现数据的增删改查操作。 首先,理解存储过程是数据库中的一个重要概念。存储过程是一组预先编译好的SQL语句集合,它可以包含控制流语句、输入/输出参数,甚至可以有...

    java调用存储过程(含out参数)

    在这个例子中,`my_procedure`是存储过程名,`123`是传递给存储过程的`IN`参数,而`OUT`参数是一个字符串类型,我们使用`getString()`方法读取。 请注意,不同的数据库可能需要不同的JDBC驱动和特定的语法。上述...

    oracle存储过程返回多行多列的结构化数组,java调用并解析

    在Java中调用这个存储过程,我们需要使用JDBC的CallableStatement接口,并指定Oracle的ARRAY类型作为输出参数。以下是一个简单的示例: ```java import oracle.jdbc.OracleConnection; import oracle.jdbc.Oracle...

    jdbc针对存储过程通用的jdbc封装.zip

    3. 设置参数:如果存储过程有输入或输出参数,使用`CallableStatement.registerOutParameter()`注册输出参数,并使用`setXXX()`方法设置输入参数,其中XXX代表Java数据类型。 4. 执行存储过程:调用`...

    jdbc调用存储过程实现增删改查

    本文将深入探讨如何使用JDBC调用Oracle数据库的存储过程来实现增删改查操作。 首先,理解JDBC是Java与各种数据库交互的桥梁,它提供了一组API,允许程序员执行SQL语句并处理结果。Oracle数据库则是一种广泛使用的...

    用JDBC操作Oracle的存储过程返回值

    总的来说,使用JDBC操作Oracle的存储过程返回值涉及了JDBC的基本操作,包括加载驱动、建立连接、创建CallableStatement、设置参数、执行存储过程、获取返回值以及释放资源。理解这些步骤对于开发与Oracle数据库交互...

    JDBC创建触发器 JDBC存储过程 JDBC创建表 数据备份 java备份数据库/JAVA恢复数据、java导入sql脚本

    Java程序员可以使用`CallableStatement`接口来执行存储过程,它允许我们传递参数并接收结果。存储过程可以提高性能,减少网络通信,同时提供封装和重用的特性。 接着,**JDBC创建表** 涉及到使用`Statement`或`...

    Java调用带参数的存储过程并返回集合

    在处理数组参数时,Oracle提供了PL/SQL TABLE类型的参数,Java可以通过数组或Java Collection类型传递。在返回集合时,可以将结果集映射到Java集合对象,如ArrayList或自定义的实体类,这样可以更好地适应业务需求。...

    jdbc调用存储过程 函数例子

    如果存储过程有输出参数,可以使用`getXXX`方法获取结果: ```java int outputValue = cs.getInt(2); ``` #### 步骤6:关闭资源 最后,记得关闭CallableStatement和Connection: ```java cs.close(); conn.close...

    jdbc调用存储过程,函数,游标

    在JDBC中调用存储过程通常涉及以下步骤: 1. 加载并注册数据库驱动,建立数据库连接。 2. 创建CallableStatement对象,它继承自PreparedStatement,专门用于调用数据库的存储过程。 3. 使用CallableStatement的`{}`...

    jdbc连接oracle,执行存储过程,带数据库存储过程

    2. 设置参数:根据存储过程的输入参数类型,调用`setXXX()`方法设置参数值,例如`cs.setInt(1, param1)`。 3. 执行存储过程:调用CallableStatement的`execute()`方法执行存储过程。 4. 处理结果:如果存储过程有...

Global site tag (gtag.js) - Google Analytics