4

我需要使用 PL/SQL 表类型的参数对过程进行 JDBC 调用。我正在尝试使用结构对象。但我没有做一些正确的事情。我收到错误:ORA-04043:对象“scott”。“objListStruct”不存在。

这是代码片段:

conn = Application.getDBConnection();
                CallableStatement cStmt = null;
                cStmt= conn.prepareCall("{call package1.procedure1"+"(?)}");
                Struct objListStruct = conn.createStruct("objListStruct",
                                objNameArr.toArray());
                cStmt.setObject(1, objListStruct,Types.STRUCT);

参数“?” 对于此过程,类型为:

TYPE t_name IS TABLE OF TABLE1.name%TYPE

任何使这项工作的见解都受到高度赞赏。谢谢

4

2 回答 2

2
String[] varStrArr = varArr.toArray(new String[compNameArr.size()]);
OracleCallableStatement cStmt = (OracleCallableStatement) 
conn.prepareCall("BEGIN SCHEMA.PACKAGE.procedure(?);END;");
cStmt.setPlsqlIndexTable(1,varStrArr,varStrArr.length,varStrArr.length,
                        OracleTypes.VARCHAR, 50);
cStmt.execute();

上面的代码有效。更多参考资料可在以下位置获得: 绑定 IN 参数

于 2012-06-01T13:06:52.513 回答
1

两件事情:

1)最简单的方法是不向程序传递任何东西。创建一个全局临时表,插入所需的所有数据,然后调用从临时表中读取的 proc。请注意不要自动提交连接。

2)如果你必须传入一个数组,你需要下拉并使用Oracle Array 类型。Oracle 数组类型将绑定到表类型。所以类似于(注意:代码未测试!)与此类似:

Object[] arrayObject = { x, y };

ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor(
        "MY_SCHEMA.MY_ARRAY_TYPE", conn);
ARRAY myArray = new ARRAY(descriptor, conn, arrayObject);


CallableStatement cs = conn
        .prepareCall("{ call package1.procedure1(?)}");
cs.setArray(1, myArray);
cs.execute();
conn.close();
于 2012-05-23T00:59:07.427 回答