当前位置: 首页 > 知识库问答 >
问题:

JDBC使用PL SQL table类型的参数调用Oracle存储过程

詹甫
2023-03-14

我需要对一个参数为PL/SQL表的过程进行JDBC调用。我正在尝试结构对象。但是我没有做正确的事情。我得到错误: ORA-04043:对象“斯科特”。“对象列表结构”不存在。

以下是代码片段:

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

我们非常感谢任何能让我们成功的见解谢谢

共有2个答案

越昊穹
2023-03-14

两件事:

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();
易宏阔
2023-03-14
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();

上面的代码可以工作。更多参考材料可在:绑定输入参数

 类似资料:
  • 我有一个非常复杂的oracle存储过程,它搜索和检索一些数据。该过程返回一个输出参数-oracle游标。我通过JDBC执行过程: 问题是,查询有时会花费相当长的时间(几分钟),我希望用户能够通过单击按钮随时取消查询。我引用了stmt对象,但不幸的是(从其他线程)调用stmt.cancel()没有效果。 另一方面,当我将CallableStatement sql更改为以下查询时: 在调用stmt.c

  • 由于JPublisher自Oracle12c以来就不受欢迎,我们目前正在考虑其他方法,如何调用具有复杂对象类型作为参数的存储过程,而不是生成的类和JDBC。 似乎EclipseLink JPA扩展是唯一可以帮助它的工具。根据我发现的示例,我可以用简单类型作为参数调用过程。但是我无法注释我的实体类,以便当对象稍微复杂一些时,它们能够正确地映射到数据库中的PL/SQL对象类型。 例如,我们有一个存储过

  • 我在HANA数据库中创建了这个存储过程,它使用两个参数,一个是表类型,另一个是。 现在我想在Java中调用这个过程,我写了这样的东西。 有人能告诉我在调用此存储过程时,如何将对象作为参数中的表实体传递吗?

  • 我通过Hibernate调用了一个带有OUT参数的存储过程,得到了以下错误: 我的存储过程: Hibernate映射: 我按如下方式调用了存储过程: 有人能解释一下这段代码有什么问题吗?

  • 主要内容:创建CallableStatement对象,关闭CallableStatement对象,JDBC SQL转义语法在讨论JDBC Statement教程文章时,我们已经学习了如何在JDBC中使用存储过程。 本教程文章与该部分类似,但它将讲解演示有关JDBC SQL转义语法的其他信息。 就像对象创建和对象一样,它可使用同样的方式创建对象,该对象将用于执行对数据库存储过程的调用。 创建CallableStatement对象 假设需要执行以下Oracle存储过程 - 注意:上面的存储过程是为O

  • 我创建了一个存储过程,如下所示: //mysql中的存储过程 并且我正在调用Java中的存储过程,如下所示: //使用JDBC调用存储过程 但它显示了一个编译时异常,如下所示: CAN在参数中为存储的函数调用的返回值设置。