java - 使用数组调用PL / SQL存储过程

时间:2015-08-21 22:50:50

标签: java oracle jdbc plsql associative-array

我有一个类似于以下需要用Java调用的PL / SQL存储过程:

TYPE AssocArrayVarchar20_t   is table of VARCHAR2(20)   index by BINARY_INTEGER
TYPE AssocArrayVarchar4100_t is table of VARCHAR2(4100) index by BINARY_INTEGER
TYPE AssocArrayNumber_t      is table of NUMBER         index by BINARY_INTEGER

PROCEDURE DATA_WRITE( I_NAME IN AssocArrayVarchar20_t,
                      I_NUM  IN AssocArrayNumber_t,
                      I_NOTE IN AssocArrayVarchar4100_t)
    // Do Stuff
END DATA_WRITE;

我在Java中尝试了以下内容:

CallableStatement stmt = conn.prepareCall("begin DATA_WRITE(?, ?, ?); end;");
stmt.setArray(0, conn.createArrayOf("VARCHAR", new String[]{ name }));
stmt.setArray(1, conn.createArrayOf("NUMBER", new Integer[]{ num }));
stmt.setArray(2, conn.createArrayOf("VARCHAR2", new String[]{ notes }));
stmet.execute;

当我这样做时,我会在SQLException: Unsupported Feature"方法上获得createArrayOf()。我还尝试了setObject()createArrayOf内部:"varchar""AssocArrayVarchar20_t""varchar_t"。似乎没有什么能改变这种结果。

有谁知道我做错了什么?我似乎无法让它发挥作用。

更新:成功!

OracleCallableStatement pStmt = (OracleCallableStatement) conn.prepareCall("begin DATA_WRITE(?, ?, ?); end;");
pStmt.setPlsqlIndexTable(1, new String[]{ name }, 1, 1, OracleTypes.VARCHAR, 20);
pStmt.setPlsqlIndexTable(2, new Integer[]{ num }, 1, 1, OracleTypes.NUMBER, 0);
pStmt.setPlsqlIndexTable(3, new String[]{ notes }, 1, 1, OracleTypes.VARCHAR, 4100);
pStmt.execute();

2 个答案:

答案 0 :(得分:1)

{1.6}引入了createArrayOf method,但据我所知,它不能处理Oracle的PL / SQL关联数组。如果您有Oracle JDBC驱动程序,则可以访问oracle.sql类。

您应该能够将CallableStatement转发给OracleCallableStatement。从那里你可以调用the setPlsqlIndexTable method,你应该可以传入一个Java数组。

  

在IN参数模式下绑定PL / SQL索引表参数。

答案 1 :(得分:1)

以下是传递Arrays的官方指南参考,以防您需要传递数组而不是表:oracle guide

  

Oracle JDBC不支持JDBC 4.0方法createArrayOf方法   java.sql.Connection接口。此方法仅允许匿名   数组类型,同时命名所有Oracle数组类型。使用Oracle   具体方法是oracle.jdbc.OracleConnection.createARRAY。

     

将数组传递到准备好的声明

     

将数组传递给预准备语句,如下所示。

     

注意:您可以将数组用作IN或OUT绑定变量。限定   要作为传递给预准备语句的数组   oracle.sql.ARRAY对象。

     

ARRAY array = oracle.jdbc.OracleConnection.createARRAY(sql_type_name,   的要素); sql_type_name是指定用户定义的Java字符串   数组的SQL类型名称和元素是java.lang.Object   包含元素的Java数组。

     

创建一个包含SQL的java.sql.PreparedStatement对象   要运行的声明。

     

将准备好的语句转换为OraclePreparedStatement,然后使用   setARRAY将数组传递给预准备语句。

     

(OraclePreparedStatement)stmt.setARRAY(parameterIndex, array);   parameterIndex是参数索引,数组是   您之前构建的oracle.sql.ARRAY对象。

     

运行预准备语句。

注意:通过

ARRAY array = oracle.jdbc.OracleConnection.createARRAY(sql_type_name, elements); 

他们的意思是:

java.sql.Connection connection = ...
oracle.jdbc.OracleConnection oracleConnection = connection.unwrap(OracleConnection.class);
ARRAY array = oracleConnection.createARRAY(sql_type_name, elements);