Как читать данные курсора внутри другого курсора?

Надо завершить разработку, сделанную сотрудником, который покинул компанию. Пытаюсь понять курсор, встроенный внутри другого курсора. Что-то вроде этого:

CURSOR c_fund as select col_1, col_2, 
    CURSOR (select col_10 * {some formula} clo_n, col_m 
            from table2 
            where col_8 is not null)
[...]

Как можно тогда прочитать в коде внутренний курсор?

Когда выполняю запрос главного курсора, получается такой результат:

COL_1        COL_2   CURSOR
-------      ------  -------
11619187    604441  (CURSOR)
11619187    604434  (CURSOR)
11619187    604439  (CURSOR)

После двойного клика в TOAD на CURSOR, появляется новое окно:

CLO_N   COL_M
-----   ---------------
009511  1g0-M-TPT_BNM
009511  1g0-Q--213_BNM
009511  C--F_R*P_C:R:CT
[...]

Свободный перевод вопроса How to read a cursor inside another cursor in PL/SQL от участника @Mohamad


Ответы (1 шт):

Автор решения: 0xdb

Переменные курсора помогут. Воспроизводимый пример кода ниже доллжен помочь понять, как это работает.
Возмите сразу на заметку:

  • Выражение CURSOR возвращает указатель на открытый курсор, работа с которым не отличается от с обьявленным в блоке явным курсором.
  • Запрос в выражении CURSOR, который не вернёт ни одной записи НЕ вызовет исключения NO_DATA_FOUND.
declare
    type refcursor is ref cursor;
    CURSOR maincur IS
        SELECT l.city, CURSOR (
            SELECT d.department_name||'/'||e.last_name
            FROM hr.employees e 
            JOIN  hr.departments d ON d.department_id = e.department_id) emps
        FROM hr.locations l
        WHERE l.location_id = 1700;
   innercur refcursor;
   city hr.locations.city%type;
   title varchar2 (64);
begin
   open maincur;
   loop fetch maincur into city, innercur;
       exit when maincur%NOTFOUND;
        --Теперь, можно циклом выбирать записи внутреннего курсора
        loop fetch innercur into title;
            exit when innercur%NOTFOUND;
            dbms_output.put_line (city||': '||title);
        end loop;
        close innercur;   
   end loop;
   close maincur;
end;
/    

Выведет:

Seattle: Administration/Whalen
Seattle: Marketing/Fay
Seattle: Marketing/Hartstein
Seattle: Purchasing/Tobias
[...]

PS Использована стандартная схема HR, которaя доступна на GitHub.


Свободный перевод ответа от участника @Steven Feuerstein

→ Ссылка