Невозможно получить двумерный ассоциативный массив в параметре OUT из JDBC - PullRequest
0 голосов
/ 19 сентября 2019

Я создал процедуру, которая принимает параметры 5 IN и 1 OUT.Цель процедуры - объединить повторяющиеся строки в одну строку и вернуть список консолидированных строк.Для этого я использовал вложенный ассоциативный массив.Внутренний ассоциативный массив хранит данные столбца, проиндексированные целочисленным значением, а внешний ассоциативный массив хранит строку.При выполнении через SQL-разработчик работает нормально и возвращает строку.Однако мне нужно, чтобы этот процесс вызывался из кода jdbc.

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();

Я ожидаю получить вложенный ассоциативный массив обратно в вывод.Но я получаю сообщение об ошибке, как показано ниже:

Исключение в потоке "main" java.sql.SQLException: ORA-06550: строка 1, столбец 83: PLS-00103: обнаружен символ ";"при ожидании одного из следующих действий:

(начинайте регистр, объявляйте конец, завершайте исключение, выходите для goto, если цикл mod null прагма повышение возвращать выберите обновление, в то время как с помощью << продолжить закрыть текущий удалить выборку заблокировать вставить вставить открытый откат сохранить точку сохранения set sql execute commit forallОчистка канала слияния Символ «exit» был заменен на «;» для продолжения. </p>

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:

Теперь я получаю другую ошибку

Исключение в потоке "main" 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 Ответ

0 голосов
/ 19 сентября 2019

Возможно, помогут следующие исправления:

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;}";
...