【问题标题】:Unable to get 2-d associative array in OUT param from JDBC无法从 JDBC 获取 OUT 参数中的二维关联数组
【发布时间】: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:语句被忽略

【问题讨论】:

    标签: oracle jdbc plsql procedure


    【解决方案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;}";
    

    【讨论】:

    • 不要你认为这只是一维数组,没有像二维数组那样的表格
    • 是的,没错。请仅对过程调用的更改进行测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 2014-09-02
    相关资源
    最近更新 更多