Я создал процедуру, подпись которой выглядит следующим образом:
PROCEDURE CUSTOMER_LIST_FOR_SUSPICIOUS_CHECK (
pCustNo NUMBER,
pCustomerList OUT EMOB.PKG_FINGER.CUSTOMER_LIST,
pErrorFlag OUT VARCHAR2,
pErrorMessage OUT VARCHAR2);
Итак, я хочу вызвать эту процедуру из java. Я много исследовал и получил следующий код:
String query = "begin BIOTPL.PKG_FINGER.CUSTOMER_LIST_FOR_SUSPICIOUS_CHECK(?, ?, ?, ?); end;";
CallableStatement stmt = conn.prepareCall(query);
stmt.setInt(1, 83);
stmt.registerOutParameter(2, OracleTypes.ARRAY, "BIOTPL.PKG_FINGER.CUSTOMER_LIST");
stmt.registerOutParameter(3, OracleTypes.VARCHAR);
stmt.registerOutParameter(4, OracleTypes.VARCHAR);
stmt.execute();
Но после выполнения вышеуказанного кода я получаю следующую ошибку:
Mar 18, 2018 10:25:09 AM testsimple.accha getAccha
SEVERE: null
java.sql.SQLException: invalid name pattern: BIOTPL.PKG_FINGER.CUSTOMER_LIST
at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:263)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:271)
at oracle.jdbc.oracore.OracleTypeADT.initMetadata(OracleTypeADT.java:543)
at oracle.jdbc.oracore.OracleTypeADT.init(OracleTypeADT.java:462)
at oracle.sql.ArrayDescriptor.initPickler(ArrayDescriptor.java:1678)
at oracle.sql.ArrayDescriptor.<init>(ArrayDescriptor.java:291)
at oracle.sql.ArrayDescriptor.createDescriptor(ArrayDescriptor.java:206)
at oracle.sql.ArrayDescriptor.createDescriptor(ArrayDescriptor.java:175)
at oracle.sql.ArrayDescriptor.createDescriptor(ArrayDescriptor.java:158)
at oracle.sql.ArrayDescriptor.createDescriptor(ArrayDescriptor.java:125)
at oracle.jdbc.driver.NamedTypeAccessor.otypeFromName(NamedTypeAccessor.java:84)
at oracle.jdbc.driver.TypeAccessor.initMetadata(TypeAccessor.java:89)
at oracle.jdbc.driver.T4CCallableStatement.allocateAccessor(T4CCallableStatement.java:629)
at oracle.jdbc.driver.OracleCallableStatement.registerOutParameterInternal(OracleCallableStatement.java:166)
at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:207)
at oracle.jdbc.driver.OracleCallableStatementWrapper.registerOutParameter(OracleCallableStatementWrapper.java:1584)
at testsimple.accha.getAccha(accha.java:54)
at testsimple.accha.main(accha.java:78)
Определение customer_list выглядит следующим образом:
TYPE CUSTOMER_REC IS RECORD
(
CUST_NO NUMBER,
CUST_CODE VARCHAR2 (50),
CUST_NAME VARCHAR2 (500)
);
TYPE CUSTOMER_LIST IS TABLE OF CUSTOMER_REC
INDEX BY BINARY_INTEGER;
Не могу понять, в чем ошибка? Пожалуйста, помогите мне устранить ошибку и получить параметр из процедуры oracle pl / sql.
Какие есть решения в этом случае?
Если поменять тип записи на тип объекта, это сработает?




Драйвер Oracle имеет специальный API для этого варианта использования под названием registerIndexTableOutParameter. Ваш код будет выглядеть так:
((oracle.jdbc.OracleCallableStatement)stmt).registerIndexTableOutParameter(2, 500, OracleTypes.STRUCT, 0);
См. JavaDoc для получения более подробной информации о параметрах: https://docs.oracle.com/database/121/JAJDB/oracle/jdbc/OracleCallableStatement.html#registerIndexTableOutParameter_int__int__int__int_
java.sql.SQLException: недопустимый тип элемента таблицы индекса PL / SQL
Это может быть связано с тем, что ваш индекс представляет собой двоичное целое число. Можете ли вы вместо этого попробовать номер?
Согласно документация драйвер Oracle JDBC поддерживает таблицы индексации PL / SQL только скалярных типов данных. Индексированные таблицы (таблица OF xxx INDEX BY yyy) типов записей не поддерживаются драйвером, ваш код не будет работать. В этом случае я бы использовал простой набор результатов, передача массивов пользовательских записей затруднительна и обычно не переносима, различные базы данных и их драйверы реализуют это немного по-другому.