Рассмотрим следующий пример блока PL/SQL, где используется (а) обычный курсор для SELECT и (б) курсорное выражение внутри: SET SERVEROUTPUT ON
DECLARE CURSOR main_cur IS SELECT dname , CURSOR ( SELECT ename FROM emp WHERE emp.deptno = dept.deptno )
FROM dept ; deptname dept.dname%TYPE; empname emp.ename%TYPE; inner_cur SYS_REFCURSOR;
BEGIN OPEN main_cur; LOOP FETCH main_cur INTO deptname, inner_cur;
EXIT WHEN main_cur%NOTFOUND; dbms_output.put_line ( '-----------------' deptname ); LOOP FETCH inner_cur INTO empname; EXIT WHEN inner_cur%NOTFOUND; dbms_output.put_line( empname ); END LOOP; CLOSE inner_cur; END LOOP; CLOSE main_cur; END; /
В результате такой организации запроса мы не просто выдали список отделов и их сотрудников, но смогли обработать каждый раз возникающий перечень сотрудников программно. Если бы не было выражения CURSOR, такого рода программную обработку можно было бы организовать только заведя в программе два курсора, а не один (а при использовании в одном предложении SELECT сразу нескольких
курсорных выражений, возможно вложенных, – более чем два).
Более того, этот один программный курсор с выражениями CURSOR просто и точно указывает на логику обработки предложения SELECT (то есть играет документирующую роль), в то время как определение в программе нескольких курсоров без курсорных выражений ничего
не говорит о логике их совместной обработки, так что понять последнюю мы сможем только по процедурным конструкциям, а давно известно, что понять, что делает программа, по процедурным конструкциям гораздо труднее, чем по описаням ее структур.
Более того, при использовании курсорного выражения мы избавлены от необходимости его открывать, сразу приступая к операциям FETCH, что быстрее в исполнении и экономнее в тексте.
Резюме: использование ссылки на курсор в предложении SELECT упрощает код программной
обработки, улучшает читаемость кода и повышает эффективность его исполнения.