Как читать данные курсора внутри другого курсора?
Надо завершить разработку, сделанную сотрудником, который покинул компанию. Пытаюсь понять курсор, встроенный внутри другого курсора. Что-то вроде этого:
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 шт):
Переменные курсора помогут. Воспроизводимый пример кода ниже доллжен помочь понять, как это работает.
Возмите сразу на заметку:
- Выражение
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