当前位置: 首页 > 面试题库 >

从0jdbc6 JDBCthin驱动程序使用自定义对象返回类型调用Oracle PL / SQL过程

徐鸿文
2023-03-14
问题内容

我正在编写一些JDBC代码,该代码调用具有“自定义对象”返回类型的Oracle 11g PL /
SQL过程。每当我尝试使用返回类型的寄存器时,根据所设置的类型执行该语句时,都会收到ORA-03115或PLS-00306错误。下面是一个示例:

PLSQL代码:

Procedure GetDataSummary (p_my_key    IN    KEYS.MY_KEY%TYPE,
                          p_recordset OUT   data_summary_tab,
                          p_status    OUT   VARCHAR2);

更多PLSQL代码(自定义对象详细信息):

CREATE OR REPLACE TYPE data_summary_obj
AS
   OBJECT (data_key             NUMBER,
           data_category        VARCHAR2 (100),
           sensitive_flag       VARCHAR2 (1),
           date_created         DATE,
           date_rep_received    DATE,
           date_first_offering  DATE,
           agency_data_ref      VARCHAR2 (13),
           change_code          VARCHAR2 (120),
           data_ref             VARCHAR2 (50),
           data_status          VARCHAR2 (100),
           data_count           NUMBER)
/

CREATE OR REPLACE TYPE data_summary_tab AS TABLE OF data_summary_obj
/

Java代码:

String query = "begin manageroleviewdata.getdatasummary(?, ?, ?); end;");
CallableStatement stmt = conn.prepareCall(query);

stmt.setInt(1, 83);

stmt.registerOutParameter(2, OracleTypes.CURSOR); // Causes error: PLS-00306
stmt.registerOutParameter(3, OracleTypes.VARCHAR);

stmt.execute(stmt); // Error mentioned above thrown here.

谁能给我一个例子,说明我该怎么做?我想有可能。但是我看不到行集OracleType。CURSOR,REF,DATALINK等失败。

抱歉,这是一个愚蠢的问题。我不是PL / SQL专家,并且在某些问题上可能使用了错误的术语。(如果是这样,请编辑我)。

提前致谢。

Regs,安德鲁


问题答案:

我终于(在别人的帮助下)找到了答案。它分为三个部分:

首先是我需要使用:

OracleCallableStatement stmt = (OracleCallableStatement) conn.prepareCall(query);

而不是我一直尝试使用的简单JDBC CallableStatement。

第二部分是我必须按如下方式注册“ out”参数:

stmt.registerOutParameter(2, OracleTypes.STRUCT, "DATA_SUMMARY_TAB");

第三部分(在上面的第二部分中是隐含的)是“ DATA_SUMMARY_TAB”必须在大写形式下。如果使用小写形式,则会收到如下所示的错误消息:

java.sql.SQLException: invalid name pattern: MYTEST.data_summary_tab

在oracle.jdbc.oracore.OracleTypeADT.initMetadata(OracleTypeADT.java:553)在oracle.jdbc.oracore.OracleTypeADT.init(OracleTypeADT.java:469)在oracle.sql.StructDescriptor.initPickler(StructDescriptor.java:390)
oracle.sql.StructDescriptor。(StructDescriptor.java:320)

而已。

另外,请注意,我们的自定义对象类型不在任何程序包中。如果是这样,您可能需要修改一下第三个参数。



 类似资料:
  • 问题内容: 我有一个plsql程序 我尝试在Java代码中调用它。我已经使用其他过程执行了所有参数均为VARCHAR类型的过程,但是这里所有参数都是“ bd_tb_struct” 我也有一个带有此Comment的Java类。“数据库中对应类型的类。(bd_tb_struct)” 有人可以解释一下我该如何称呼我的程序吗? 问题答案: Oracle安装程序 : Java SQLData类 : 从Jav

  • 我试图创建一个以记录类型为参数的过程。我的问题是,我不能在过程之前定义我的类型,它说我的类型没有声明。。我该怎么做? 这是我的代码: 错误(1,29):PLS-00201:必须声明标识符“TIP”

  • 为Electron应用编写自动测试, 你需要一种 "驱动" 应用程序的方法。 Spectron 是一种常用的解决方案, 它允许您通过 WebDriver 模拟用户行为。 当然,也可以使用node的内建IPC STDIO来编写自己的自定义驱动。 自定义驱动的优势在于,它往往比Spectron需要更少的开销,并允许你向测试套件公开自定义方法。 我们将用 Node.js 的 child_process

  • 为Electron应用编写自动测试, 你需要一种 "驱动" 应用程序的方法。 Spectron is a commonly-used solution which lets you emulate user actions via WebDriver. 当然,也可以使用node的内建IPC STDIO来编写自己的自定义驱动。 自定义驱动的优势在于,它往往比Spectron需要更少的开销,并允许你向

  • 问题内容: 我想为对数据库表执行后端操作的Django manage.py命令编写单元测试。如何直接从代码中调用管理命令? 我不想从tests.py在操作系统的外壳上执行命令,因为我无法使用通过manage.py test设置的测试环境(测试数据库,测试虚拟电子邮件发件箱等)。 问题答案: 测试这类事情的最佳方法-从命令本身提取所需功能到独立功能或类。它有助于从“命令执行内容”中提取内容并编写测试