Вызов процедуры Oracle PL / SQL с типами возврата пользовательских объектов из драйверов JDBC 0jdbc6 - PullRequest
3 голосов
/ 19 апреля 2010

Я пишу некоторый код JDBC, который вызывает процедуру Oracle 11g PL / SQL, которая имеет тип возвращаемого значения Custom Object. Всякий раз, когда я пытаюсь зарегистрировать мои типы возврата, я получаю либо ORA-03115, либо PLS-00306 как ошибку, когда оператор выполняется в зависимости от установленного мной типа. Пример ниже:

Код PLSQL:

Procedure GetDataSummary (p_my_key    IN    KEYS.MY_KEY%TYPE,
                          p_recordset OUT   data_summary_tab,
                          p_status    OUT   VARCHAR2);

Больше кода PLSQL (пользовательские данные объекта):

CREATE OR REPLACE TYPE data_summary_obj
AS
   OBJECT (data_key             NUMBER,
           data_category        VARCHAR2 (100),
           sensitive_flag       VARCHAR2 (1),
           date_created         DATE,
           date_rep_received    DATE,
           date_first_offering  DATE,
           agency_data_ref      VARCHAR2 (13),
           change_code          VARCHAR2 (120),
           data_ref             VARCHAR2 (50),
           data_status          VARCHAR2 (100),
           data_count           NUMBER)
/

CREATE OR REPLACE TYPE data_summary_tab AS TABLE OF data_summary_obj
/ 

Java-код:

String query = "begin manageroleviewdata.getdatasummary(?, ?, ?); end;");
CallableStatement stmt = conn.prepareCall(query);

stmt.setInt(1, 83);

stmt.registerOutParameter(2, OracleTypes.CURSOR); // Causes error: PLS-00306
stmt.registerOutParameter(3, OracleTypes.VARCHAR);

stmt.execute(stmt); // Error mentioned above thrown here.

Может ли кто-нибудь предоставить мне пример, показывающий, как я могу это сделать? Я думаю, это возможно. Однако я не вижу набор строк OracleType. CURSOR, REF, DATALINK и другие ошибки.

Извиняюсь, если это тупой вопрос. Я не эксперт по PL / SQL и, возможно, использовал неправильную терминологию в некоторых областях моего вопроса. (Если это так, пожалуйста, отредактируйте меня).

Заранее спасибо.

Regs, Andrew

Ответы [ 2 ]

4 голосов
/ 07 мая 2010

Я наконец (с небольшой помощью других) узнал ответ на этот вопрос. Он состоял из трех частей:

Первое, что мне нужно было использовать:

OracleCallableStatement stmt = (OracleCallableStatement) conn.prepareCall(query);

, а не простое JDBC CallableStatement, которое я пытался использовать.

Вторая часть заключалась в том, что я должен был зарегистрировать свой параметр «out» следующим образом:

stmt.registerOutParameter(2, OracleTypes.STRUCT, "DATA_SUMMARY_TAB");

Третья часть, и она подразумевается в части 2 выше, заключалась в том, что "DATA_SUMMARY_TAB" должен быть в верхнем регистре. Если вы поставите его в нижнем регистре, вы получите загадочное сообщение об ошибке:

java.sql.SQLException: invalid name pattern: MYTEST.data_summary_tab

в oracle.jdbc.oracore.OracleTypeADT.initMetadata (OracleTypeADT.java:553) в oracle.jdbc.oracore.OracleTypeADT.init (OracleTypeADT.java:469) в oracle.sql.StructDescriptor.initPickler (StructDescriptor.java:390) в oracle.sql.StructDescriptor. (StructDescriptor.java:320)

Вот и все.

Также обратите внимание, что наш пользовательский тип объекта отсутствовал ни в одном пакете Если это так, вам может понадобиться немного взломать третий параметр.

1 голос
/ 19 апреля 2010

Вы два разных и возможно противоречивых сообщения об ошибках там.

PLS-00306: wrong number or types of arguments in call to 'string' 

Что такое описание пользовательского типа data_summary_tab? OracleTypes.CURSOR ожидает REF CURSOR, который эквивалентен JDBC ResultSet. Принимая во внимание, что data_summary_tab звучит так, как будто это может быть varray или вложенная таблица.

ORA-03115: unsupported network datatype or representation

Это предполагает, что вы используете более старую версию клиента, чем сервер базы данных (скажем, 10g или даже 9i). Обычно мы можем сойти с рук, но иногда это может вызвать ошибки, когда мы делаем необычные вещи. Я не уверен, должен ли вызов пользовательских типов через JDBC считаться "необычной вещью", но я подозреваю, что это может.

...