日期:2014-05-16 浏览次数:20452 次
别人提到的问题,试验了一下, 是没问题的,过程如下。
使用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> |
?