从 Java 使用表类型参数调用 OracleDB 过程——DB 总是接收空值而不是值

出于某种原因,DB 没有收到它通过表参数提供的值。它看到表中的行数正确,并且给定的列数也是正确的(否则我会收到不匹配的错误消息),但值本身为空。


数据库版本 ( SELECT * FROM V$VERSION):


Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

PL/SQL Release 12.1.0.2.0 - Production

"CORE   12.1.0.2.0  Production"

TNS for 64-bit Windows: Version 12.1.0.2.0 - Production

NLSRTL Version 12.1.0.2.0 - Production

使用 oracle 驱动程序 ojdbc6(版本 11.2.0.4)、ojdbc7(版本 11.2.0.4)、ojdbc7(版本 12.1.0.2)进行测试。


这是数据库程序的签名:


Procedure Send_Message_Test (

    i_Receiver_List_Users_Tbl    In Receiver_List_Users_Tbl

);

类型:


CREATE OR REPLACE Type Receiver_List_Users_Rt Force As Object (

  User_Id Varchar2(30 Char)

)

/


CREATE OR REPLACE Type Receiver_List_Users_Tbl Is Table Of Receiver_List_Users_Rt


温温酱
浏览 93回答 2
2回答

炎炎设计

我的猜测是您没有正确创建或填充 PL/SQL 存储过程的 IN 参数。下面是一个代码片段,其中包含您发布的部分代码(“TestApplication.java”)并添加了我希望能解决您的问题的代码。已编辑Connection conn = DataSourceUtils.getConnection(dataSource); // your codeObject[] attributes = new Object[1];attributes[0] = "Test";java.sql.Struct obj = conn.createStruct("Receiver_List_Users_Rt", attributes);Object[] elems = new Object[1];elems[0] = obj;oracle.jdbc.OracleConnection oraConn = (oracle.jdbc.OracleConnection) conn;java.sql.Array objs = oraConn.createARRAY("Receiver_List_Users_Tbl", elems);callStmt.setArray(1, objs);callStmt.execute(); // your code

慕哥9229398

关闭不令人满意,但是 DB 人员拆除了环境,创建了一个新环境,然后它开始工作了。所以问题不在于 java 或驱动程序端。无论 DB 出了什么问题,仍然是一个无法挽回的谜
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java