Выборка данных из таблицы PL-SQL в качестве параметра OUT в Java

#java #oracle #jdbc

#java #Oracle #jdbc

Вопрос:

Я выполняю процедуру из кода Java, которая имеет 2 параметра out, одним из которых является таблица объектов. вот обзор пакета

 PROCEDURE SalesProc (
  p_S_table             IN t_s_table
, p_T_table             IN OUT t_t_table           
, x_message             OUT VARCHAR2                     
  

)

t_table — это параметр OUT, который содержит несколько строк и чисел в нем. Перед выполнением пакета я создаю массив SalesObject и устанавливаю в него.

Здесь цель состоит в том, чтобы получить некоторое значение из t_table с помощью ResultSet.

источник, который я пытаюсь заставить работать, это:

  callstmt.registerOutParameter(2, Types.ARRAY,"T_TABLE");
 callstmt.setArray(2, mySalesObjectArray);
 callstmt.execute();
 java.sql.Array aa = callstmt.getArray(2);
 ResultSet rs = aa.getResultSet();

 while(rs.next()){
     String ss = rs.getString(1);
 }
  

Следующая строка выдает « java.sql.exception «

   String ss = rs.getString(1);
  

Я также пытаюсь преобразовать его в тип объекта следующим образом

  salesObject[] sArray = (salesObject[])callstmt.getArray(2);
  

Который вызывает ClassCastException.
« classcastException.Cannot cast java.lang.Object[2][id=16062] to java.lang.String[] «


как я могу избежать этих исключений?

Комментарии:

1. Вы получаете сообщение об ошибке? Каково определение T_TABLE? и т.д. и т.п. Вам нужно дать нам немного больше для работы.

2. «это не работает», пожалуйста, сообщите нам подробности. Inb каким образом это не работает? Опишите наблюдаемое поведение, включая сообщения об ошибках и т. Д. Если вы не предоставите подробную информацию, вы не получите ответа.

3. Не могли бы вы опубликовать структуру (предпочтительно синтаксис) базовой процедуры, пожалуйста?

4. Попробуйте выполнить приведение к Object[] : Object[] sArray = callstmt.getArray(2)

Ответ №1:

У вас есть 3 параметра, подсчет начинается с 1 с самого левого параметра:

  1. p_S_table
  2. p_T_table
  3. t_t_table

Я использую Oracle в качестве СУБД, но не использую параметры ввода / вывода, но я уверен, что если вы измените свою процедуру на функцию (потому что функция возвращает что-то), которая принимает входные параметры и возвращает выходные, будет работать тот же код.

Что касается приведения здесь:

 salesObject[] sArray = (salesObject[])callstmt.getArray(2); 
  

ваш salesObject класс должен реализовать либо ORAData или SQLData .
SQLData кажется лучше.