Получение списка значений из процедуры PLSQL

#java #oracle #plsql

#java #Oracle #plsql

Вопрос:

Я новичок в Java и PLSQL. Я создал эту процедуру в PLSQL:

     PROCEDURE getLogs (
    p_idcontract            IN          NUMBER,
    p_iduser                IN          NUMBER,
    o_logs                  OUT         VARCHAR2
  )
  IS   
  BEGIN
      SELECT logData INTO o_logs
      FROM SERVICELOG 
      WHERE IDCONTRACT= p_idcontract 
      AND IDUSER= p_iduser;

  END getLogs;
  

Если скрипт обнаруживает несколько строк, вернитесь к классу Java, который запускает его, с этим сообщением:

ORA-01422: точная выборка возвращает больше запрошенного количества строк

Пожалуйста, как я могу вернуть hashmap или аналогичный, готовый для вывода на Java? Спасибо.

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

1. Вам нужно cursor

Ответ №1:

Я бы использовал курсор ссылки в качестве выходного параметра, а затем построил карту внутри программы Java. https://oracle-base.com/articles/misc/using-ref-cursors-to-return-recordsets Вы также можете определить тип пользователя в oracle, который будет чем-то вроде Java Array.

     PROCEDURE getLogs (
    p_idcontract            IN          NUMBER,
    p_iduser                IN          NUMBER,
    p_recordset OUT SYS_REFCURSOR
  )
  IS   
  BEGIN
 OPEN p_recordset FOR
      SELECT logData 
      FROM SERVICELOG 
      WHERE IDCONTRACT= p_idcontract 
      AND IDUSER= p_iduser;

  END getLogs;
  

Java-код:

 CallableStatement stmt = conn.prepareCall("BEGIN getLogs(?, ?, ?); END;");
      stmt.setInt(1, 0);
      stmt.setInt(2, 0);
      stmt.registerOutParameter(3, OracleTypes.CURSOR);
      stmt.execute();
      ResultSet rs = ((OracleCallableStatement)stmt).getCursor(3);
      while (rs.next()) {
        ;
       //here build your Map, list or whatever you want
      }
  

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

1. Пожалуйста, не могли бы вы поделиться со мной примером?

2. Я отредактировал ответ, чтобы добавить ссылку на учебник, как использовать курсор ссылки.

3. Спасибо. Теперь я получил эту ошибку: «PLS-306: неправильный номер или типы аргументов при вызове GETLOGS». Может быть ошибка «на стороне Java» при определении p_recordset как МАССИВА?

4. Это не массив. В ссылке, которую я опубликовал, у вас есть пример кода Java, как считывать значения из ref cursor. Если вы вернули курсор ссылки, вам необходимо создать массив на стороне Java, пройдя через ResultSet.

5. Работает как шарм. Спасибо!!