【问题标题】:JDBC Call to Oracle Stored Procedure with parameters of type PL SQL table带有 PL SQL 表类型参数的 Oracle 存储过程的 JDBC 调用
【发布时间】: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定义的?

标签: java oracle jdbc plsql cursor


【解决方案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());
猜你喜欢
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2017-04-13
  • 1970-01-01
  • 2022-01-18
  • 2013-07-05
相关资源
最近更新 更多