为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

温温酱 2023-01-05 16:49:40

出于某种原因,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


查看完整描述

2 回答

?
炎炎设计

TA贡献1559条经验 获得超3个赞

我的猜测是您没有正确创建或填充 PL/SQL 存储过程的 IN 参数。下面是一个代码片段,其中包含您发布的部分代码(“TestApplication.java”)并添加了我希望能解决您的问题的代码。


已编辑


Connection conn = DataSourceUtils.getConnection(dataSource); // your code

Object[] 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


查看完整回答
反对 回复 2023-01-05
?
慕哥9229398

TA贡献1630条经验 获得超5个赞

关闭不令人满意,但是 DB 人员拆除了环境,创建了一个新环境,然后它开始工作了。所以问题不在于 java 或驱动程序端。无论 DB 出了什么问题,仍然是一个无法挽回的谜



查看完整回答
反对 回复 2023-01-05

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信