Я создал процедуру, которая принимает параметры 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: оператор игнорируется