2010-04-19 8 views
3

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

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, Эндрю

ответ

4

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

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

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) at oracle.sql.StructDescriptor.initPickler (StructDescriptor.java: 390) at oracle.sql.StructDescriptor. (StructDescriptor.java:320)

Всё.

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

+4

И как взломать, если параметры в пакете? –

+0

Получил меня с капитализацией – Planky

1

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

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

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

ORA-03115: unsupported network datatype or representation 

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

+0

Hi @APC. Спасибо за это. Последняя ошибка была опечаткой. Я отредактировал мой вопрос, чтобы исправить это. Я думаю, что советы по PLS-00306 - правильный трек (я вполне уверен, что мы используем правильный драйвер JDBC). Я посмотрю и отчитаюсь. –

 Смежные вопросы

  • Нет связанных вопросов^_^