我需要对一个参数类型为PL / SQL表的过程进行JDBC调用。 我正在尝试使用struct对象。但我没有做正确的事情。 我收到错误: 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
高度赞赏任何有关此工作的见解。 感谢
答案 0 :(得分: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();
答案 1 :(得分:1)
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();
以上代码有效。 更多参考资料可在: Binding IN Parameters