我有一个类似于以下需要用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();
答案 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);