无法从 JDBC 获取 OUT 参数中的二维关联数组
Posted
技术标签:
【中文标题】无法从 JDBC 获取 OUT 参数中的二维关联数组【英文标题】:Unable to get 2-d associative array in OUT param from JDBC 【发布时间】:2019-09-19 14:32:29 【问题描述】:我创建了一个接受 5 个 IN 参数和 1 个 OUT 参数的过程。该过程的目的是将重复行合并到一行中并返回合并行的列表。为此,我使用了嵌套关联数组。内部关联数组存储由整数值索引的列数据,外部关联数组存储行。通过 SQL 开发人员执行时,它可以正常工作并返回该行。但是,我需要从 jdbc 代码中调用这个 proc。
CREATE OR REPLACE PACKAGE TXN_CONSOLIDATION_PKG AS
TYPE txn_info_array_type IS TABLE OF VARCHAR2(100) INDEX BY PLS_INTEGER;
TYPE final_txn_list_type IS TABLE OF txn_info_array_type INDEX BY PLS_INTEGER;
PROCEDURE TXN_CONSOLIDATION_PROC (tableName IN VARCHAR2, tableType IN VARCHAR2, startDate IN VARCHAR2, endDate IN VARCHAR2,
cardNumber IN VARCHAR2, rowCount IN INTEGER,final_txn_list IN OUT final_txn_list_type);
END TXN_CONSOLIDATION_PKG;
Java JDBC Call
Connection c = DriverManager.getConnection("url","username","pwd");
String proc = "call TXN_CONSOLIDATION_PKG.TXN_CONSOLIDATION_PROC (?,?,?,?,?,?,?);";
OracleCallableStatement s = (OracleCallableStatement)c.prepareCall(proc);
s.setString(1, "F");
s.setString(2, "D");
s.setString(3, "01/01/2019 00:00:00");
s.setString(4, "11/01/2019 00:00:00");
s.setString(5, "Joe");
s.setInt(6, 100);
s.registerIndexTableOutParameter(7, 100, OracleTypes.INTEGER, 40);
s.executeUpdate();
我希望在输出中返回嵌套关联数组。但我收到如下错误:
线程“主”java.sql.SQLException 中的异常:ORA-06550:第 1 行,第 83 列: PLS-00103:遇到符号“;”预期以下情况之一时:
( begin case declare end exception exit for goto if loop mod null pragma raise return select update while with
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:204)
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:1041)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1329)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3665)
at oracle.jdbc.driver.OracleCallableStatement.executeUpdate(OracleCallableStatement.java:4739)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1352)
at com.fiserv.cwsi.ui.casetracker.util.CTUIUtil.main(CTUIUtil.java:2123)
更新 1:
现在我得到一个不同的错误
线程“主”java.sql.SQLException 中的异常:ORA-06550:第 1 行,第 7 列: PLS-00306:调用“TXN_CONSOLIDATION_PROC”时参数的数量或类型错误 ORA-06550:第 1 行,第 76 列: PLS-00418:数组绑定类型必须匹配 PL/SQL 表行类型 ORA-06550:第 1 行,第 7 列: PL/SQL:语句被忽略
【问题讨论】:
【参考方案1】:也许以下更正会有所帮助:
create or replace package txn_consolidation_pkg as
type txn_info_array_type is table of varchar2(100) index by pls_integer;
procedure txn_consolidation_proc(tablename in varchar2,
tabletype in varchar2,
startdate in varchar2,
enddate in date,
cardnumber in date,
rowcount in integer,
final_txn_list in out txn_info_array_type);
end txn_consolidation_pkg;
您可能还需要修改 java 调用,如下所示:
String proc = "BEGIN TXN_CONSOLIDATION_PKG.TXN_CONSOLIDATION_PROC (?,?,?,?,?,?); END;";
【讨论】:
不要你认为这只是一维数组,没有像二维数组那样的表格 是的,没错。请仅对过程调用的更改进行测试。以上是关于无法从 JDBC 获取 OUT 参数中的二维关联数组的主要内容,如果未能解决你的问题,请参考以下文章