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;

/