OR a.id=b.author2
WHERE a.id = b.author1
FROM authors a
OPEN...FOR
OPEN имя_куросра FOR select_команда;
Курсорные подзапросы.Курсорные подзапросы также называют вложенными курсорными выражениями, так как они используют курсорное выражение внутри оператора SELECT языка SQL. Другими словами, это курсоры, используемые как выражение для столбца в списке выбора для явного курсора. Они могут использоваться со всеми определенными ранее типами курсоров, за исключением неявных. Возвращаемое значение всегда имеет тип REF CURSOR.
Курсорные выражения могут уменьшить объём ненужных данных, возвращаемый в вызывающую программу. В связи с этим их можно применять вместо приемов требующих соединения таблиц. Курсорное выражение открывается автоматически при извлечении родительской строки, а закрываются, когда происходит одно из событий:
- вложенный курсор явно закрывается программой.
- закрывается родительский курсор.
- заново выполняется родительский курсор.
- во время извлечений родительской строки порождается исключение.
CURSOR возвращает вложенный курсор из запроса и имеет следующий синтаксис:
CURSOR(подзапрос)
Рассмотрим пример, который использует курсорный подзапрос в явном курсоре:
SET SERVEROUTPUT ON
DECLARE
cv_author SYS_REFCURSOR;
v_title BOOKS.TITLE%TYPE;
v_author AUTHORS.%ROWTYPE;
v_counter PLS_INTEGER:= 0;
CURSOR book_cur
IS
SELECT b.title
CURSOR (SELECT *
OR a.id=b.author3)
FROM books b
WHERE isbn=‘78824389’;
BEGIN
OPEN book_cur;
LOOP
FETCH book_cur INTO v_title, cv_author;
EXIT WHEN book_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(‘Title from the main cursor: ‘||v_title);
LOOP
FETCH cv_author INTO v_author;
EXIT WHEN cv_author%NOTFOUND;
v_counter :=v_counter + 1;
DMBS_OUTPUT.PUT_LINE(‘Author’ ||v_counter|| ‘:’
||v_author.first_name|| ‘ ‘
||v_author.last_name);
END LOOP;
END LOOP;
CLOSE book_cur;
END;
/