带有 PL SQL 表类型参数的 Oracle 存储过程的 JDBC 调用
Posted
技术标签:
【中文标题】带有 PL SQL 表类型参数的 Oracle 存储过程的 JDBC 调用【英文标题】:JDBC Call to Oracle Stored Procedure with parameters of type PL SQL table 【发布时间】:2012-05-22 23:19:35 【问题描述】:我需要使用 PL/SQL 表类型的参数对过程进行 JDBC 调用。 我正在尝试使用结构对象。但我没有做一些正确的事情。 我得到错误: ORA-04043: 对象 "scott"."objListStruct" 不存在。
这里是sn-p的代码:
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
非常感谢您对这项工作的任何见解。 谢谢
【问题讨论】:
objNameArr 是一个 arrayList ,数据准备好进入。 在你的一个 cmets 中,你说“严格来说,类型应该是 TYPE t_name IS TABLE OF TABLE1.name%TYPE INDEX by BINARY_INTEGER”。这与您在此处给出的类型定义相冲突。哪个是对的? Oracle中的类型是用SQL还是PL/SQL定义的? 【参考方案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
【讨论】:
使用 OracleCallableStatement 并在该语句上调用 setPlsqlIndexTable() 是我为使其正常工作所做的两件事。【参考方案2】:两件事:
1) 最简单的方法是不向过程传递任何内容。创建一个全局临时表,插入所需的所有数据,然后调用从临时表中读取的 proc。请注意不要自动提交连接。
2) 如果您必须 传入一个数组,则需要下拉并使用 Oracle 数组类型。 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();
【讨论】:
谢谢!我会试试这个。我假设 MY_SCHEMA 是我的架构名称。 在您的示例中,它将是 t_name。 谢谢@Nick 我离我越来越近了,但还有一步之遥。严格来说,类型应该是TYPE t_name IS TABLE OF TABLE1.name%TYPE INDEX by BINARY_INTEGER。如果我添加 INDEX BY 来创建类型,我会收到错误:不允许 PL SQL 类型。没有 INDEX BY 子句我得到运行时错误:不允许操作:顺序绑定和命名绑定不能组合! -@库马尔斯 错误信息是:调用procedure1时参数的数量或类型错误 尝试 conn = Application.getDBConnection(); ArrayDescriptor compNameArrDesc = ArrayDescriptor.createDescriptor("TYPE1", conn); ArrayDescriptor molWtArrDesc = ArrayDescriptor.createDescriptor("TYPE2", conn); ArrayDescriptor specGRArrDesc = ArrayDescriptor.createDescriptor("TYPE3", conn); ArrayDescriptor BPArrDesc = ArrayDescriptor.createDescriptor("TYPE4", conn);数组 ARR1 = 新数组(compNameArrDesc, conn, CArr1.toArray()); ARRAY ARR2 = new ARRAY(molWtArrDesc, conn, CArr2.toArray());以上是关于带有 PL SQL 表类型参数的 Oracle 存储过程的 JDBC 调用的主要内容,如果未能解决你的问题,请参考以下文章
使用带有布尔输入参数的 PL/SQL 在 oracle 中调用 java 存储过程
带有输入参数的 Oracle JDBC 调用 PL/SQL 过程记录表