我正在编写一些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设置的测试环境(测试数据库,测试虚拟电子邮件发件箱等)。 问题答案: 测试这类事情的最佳方法-从命令本身提取所需功能到独立功能或类。它有助于从“命令执行内容”中提取内容并编写测试
下面是存储库类