Доступ к типу возврата настраиваемого объекта из Oracle pl / sql в java

Я создал процедуру, подпись которой выглядит следующим образом:

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 JDBC поддерживает таблицы индексации PL / SQL только скалярных типов данных. Индексированные таблицы (таблица OF xxx INDEX BY yyy) типов записей не поддерживаются драйвером, ваш код не будет работать. В этом случае я бы использовал простой набор результатов, передача массивов пользовательских записей затруднительна и обычно не переносима, различные базы данных и их драйверы реализуют это немного по-другому.

krokodilko 18.03.2018 08:05

Какие есть решения в этом случае?

A Stranger 18.03.2018 08:46

Если поменять тип записи на тип объекта, это сработает?

A Stranger 18.03.2018 09:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
334
1

Ответы 1

Драйвер 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

A Stranger 20.03.2018 06:27

Это может быть связано с тем, что ваш индекс представляет собой двоичное целое число. Можете ли вы вместо этого попробовать номер?

Jean de Lavarene 20.03.2018 10:08

Другие вопросы по теме