在Oracle中把Array类型作为参数传入存储过程
在Oracle中把Array类型作为参数传入存储过程2010-03-02 16:46别人提到的问题,试验了一下, 是没问题的,过程如下。
使用Oracle Database 11g Enterprise Edition Release 11.2.0.1.0.
步骤:
1. 创建自定义的类型。由于Oracle没有提供现成的array类型,这里用table类型来模拟。
CREATE OR REPLACE TYPE varchar_array is Table OF varchar2(128)
创建后,varchar_array是一个table,里面元素的类型为varchar2(128).
2. 创建一个存储过程test1. 这个过程接受一个上面创建的varchar_array类型作为输入参数. 在过程体中,通过一个循环遍历传入的array中的每一个元素, 插入到一个表tb中:
create or replace procedure test1(arr in varchar_array) is
begin
?? FOR i IN arr.first .. arr.last LOOP
????? insert into tb values(arr(i));
?? END LOOP;
end test1;
3. 数据库这边的基本上完事了。 Java程序如下, 基本上和普通程序差不多:
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@192.168.1.199:1521:orcl";
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
try {
?? Class.forName(driver);
?? conn = DriverManager.getConnection(strUrl, "user", "pass");
?? CallableStatement proc = null;
?? proc = conn.prepareCall("{ call test1(?) }"); //调用存储过程test1
?? //不一样的地方,获得上面创建的自定义的类型,注意大小写
?? ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("VARCHAR_ARRAY",
??????????????????????????????????????????????? conn);
?? List list = new ArrayList();
?? list.add("a");
?? list.add("b"); ??? ???
?? //把list中的元素转换成自定义的类型
?? ARRAY array = new ARRAY(descriptor, conn, list.toArray());
?? //设置参数, 和普通的一样
?? proc.setArray(1, array);
?? //执行
?? proc.execute();
}
?? catch (Exception ex) {
?? ex.printStackTrace();
} finally {
?? ..... 各种 close ......
}
执行该Java程序,查询表tb, 程序中的元素正常插入:
SQL> select * from tb;
A
--------------------------------------------
a
b
SQL>
?
1 楼 ninnd 2011-09-28 CREATE OR REPLACE TYPE ptest_type is RECORD(ID VARCHAR2(32),
NME VARCHAR2(32)
);
CREATE OR REPLACE TYPE ptest_type_array IS TABLE OF ptest_type index by binary_integer;
create or replace package pkg_ptest_interface IS
PROCEDURE ptest_insert_data_to_table(P_dataArray ptest_type_array);
end pkg_ptest_interface;
--package body 略去--
这样的array入参怎么处理?
我用过的是ibatis
我的异常网推荐解决方案:oracle存储过程,http://www.myexception.cn/oracle-develop/177537.html