Можно ли назначить несколько курсоров Oracle ref одному - PullRequest
0 голосов
/ 05 августа 2020

Как сказано в заголовке, я хотел бы знать, можно ли назначить несколько курсоров ref (в Oracle хранимой процедуре) одному: Как следующий код: ....

    create or replace procedure assign_ref_cursor(result_cur out sys_refcursor)
    as
    cursor1 sys_refcursor;
    cursor2 sys_refcursor;
    cursor3 sys_refcursor;
    
    -- expected result:
    result_cur[0] = cursor1
    result_cur[1] = cursor2
    result_cur[2] = cursor3
...
return  result_cur;

... Хорошо, что было бы неплохо, если бы весь результат каждого ref_cursor был в одном.

Причина в том, что я получаю данные (множественный указатель ref) из хранимой процедуры, используя Данные Spring JPA. Но, по-видимому, нет решения для получения нескольких курсоров ref с помощью javax.persistence.storedprocedurequery ... несмотря на дни поиска в Google ...

Итак, я представил решение, чтобы изменить хранимую процедуру Oracle, чтобы вернуть только один ref_cursor, который «объединяет» разные ref_cursor.

Следуя вопросу Алекса, вот UPDATE

Я попытался вызвать три параметра OUT ref курсора, используя:

StoredProcedureQuery proc = entityManager.createStoredProcedureQuery("myStoredProc");
proc.registerStoredProcedureParameter("cursor1", void.class, ParameterMode.REF_CURSOR);
proc.registerStoredProcedureParameter("cursor2", void.class, ParameterMode.REF_CURSOR);
...
List<Object[]> listOfObjects =  proc.getResultList();

Но listOfObjects содержит только содержимое cursor1 Невозможно получить содержимое cursor2 ...

1 Ответ

1 голос
/ 05 августа 2020

Если у вас сейчас есть что-то вроде:

open cursor1 for <query1>;
open cursor2 for <query2>;
open cursor3 for <query3>;

, вы можете объединить их как выражения курсора в один результат:

open result_cur for
  select cursor(<query1>) as cursor1,
         cursor(<query2>) as cursor2,
         cursor(<query3>) as cursor3
  from dual;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...