Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从0jdbc6 JDBCthin驱动程序调用具有自定义对象返回类型的Oracle PL/SQL过程_Java_Jdbc_Plsql_Rdbms_Oracle11g - Fatal编程技术网

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

Java 从0jdbc6 JDBCthin驱动程序调用具有自定义对象返回类型的Oracle PL/SQL过程,java,jdbc,plsql,rdbms,oracle11g,Java,Jdbc,Plsql,Rdbms,Oracle11g,我正在编写一些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_

我正在编写一些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代码(自定义对象详细信息):

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。游标、REF、数据链接和更多失败

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

提前谢谢


Regs,Andrew

您看到了两条不同但可能相互矛盾的错误消息

PLS-00306: wrong number or types of arguments in call to 'string' 
用户定义类型
数据\u摘要\u选项卡
的索引是什么
OracleTypes.CURSOR
需要一个REF游标,它相当于一个JDBC结果集。而
data\u summary\u tab
听起来可能是varray或嵌套表

ORA-03115: unsupported network datatype or representation
这表明您使用的是比数据库服务器更旧的客户机版本(比如10g甚至9i)。正常情况下,我们可以侥幸逃脱,但有时它会在我们做不寻常事情的地方引起bug。我不确定通过JDBC调用用户定义类型是否应该算作一件“不寻常的事情”,但我怀疑这可能会发生。

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

首先,我需要使用:

OracleCallableStatement stmt = (OracleCallableStatement) conn.prepareCall(query);
而不是我一直试图使用的简单JDBC CallableStatement

第二部分是我必须注册我的“out”参数,如下所示:

stmt.registerOutParameter(2, OracleTypes.STRUCT, "DATA_SUMMARY_TAB");
java.sql.SQLException: invalid name pattern: MYTEST.data_summary_tab
第三部分,也就是上面第二部分所隐含的,“数据汇总表”必须是大写的。如果将其放在小写字母中,则会得到一条神秘的错误消息,如下所示:

stmt.registerOutParameter(2, OracleTypes.STRUCT, "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)

就这样


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

Hi@APC。谢谢你。最后一个错误是打字错误。我编辑了我的问题来纠正这一点。我认为PLS-00306上的提示是正确的(我非常确定我们使用的是正确的JDBC驱动程序)。我会看一看,然后再报告。若包里有参数,那个么如何破解?我有大写字母