Выбрать главу

SELECT product_id, name, price

FROM products

ORDER BY product_id;

Запрос не быдет выполнен до тех пор, пока вы не откроете курсор.

Шаг 3: Открыть курсор

На следующем шаге необходимо открыть курсор, для чего используется

оператор OPEN, который должен быть помещен в выполняемой секции

блока.

Следующий пример открывает курсор v_product_cursor, который выполняет

запрос:

□ OPEN v_products_cursor;

Шаг 4: Выбрать строки из курсора

Для чтения из курсора каждой строки можно использовать оператор FETCH.

Этот оператор читает значения столбцов в переменные, определенные на

шаге 1 ; для него используется следующий синтаксис:

□ FETCH имя_курсора

INTO переменная[, переменная . . . ] )

где

■ имя_курсора определяет имя курсора;

■ переменная является переменной, в которую записываются значения

из оператора SELECT курсора. Вы должны передать для каждого из

столбцов переменные того же типа, что и тип соответствующего

столбца.

362 Глава 11

Следующий пример использует оператор FETCH для выборки строки из

курсора v_produ ct_cursor и записывает значения столбцов в переменные

v_produ ct_id, v_name и v _ p ric e , созданные ранее на шаге 1 :

□ FETCH v_produ ct_cursor

INTO v_produ ct_id, v_name, v _ p rice ;

Курсор может содержать много строк; следовательно, чтобы одну за

другой прочесть каждую строку курсора, потребуется оператор цикла. Для

определения условия завершения цикла можно использовать логическую

переменную v_product_cursor%NOTFOUND. Эта переменная принимает значение

true, когда оператор FETCH достигает конца строк в курсоре и отсутствуют

строки для дальнейшего чтения. В следующем примере показан этот

цикл:

□ LOOP

- - получить строки из курсора

FETCH v_product_cursor

INTO v_produ ct_id, v_name, v _ p rice ;

— выйти из цикла, когда н§ будет больше строк для чтения, на что указывает

- - логическая переменная v_product_cursor%NOTFOUND (= tru e , когда

- - заканчиваются строки для чтения)

EXIT WHEN v_product_cursor%NOTFOUND;

— используйте для показа переменных DBMS_OUTPUT.PUT_LINE()

DBMS_OUTPUT.PUT_LINE(

' v_produ ct_id = ' || v_produ ct_id || ', v_name = ' || v_name ||

', v _ p ric e = ' || v _ p ric e

);

END LOOP;

Обратите внимание, что для показа переменных v_produ ct_id, v_name и

v _ p ric e , прочитываемых для каждой строки, используется DBMS_OUTPUT.

PUT_LINE(). В реальном приложении вы, возможно, будете использовать

v _ p ric e в сложных вычислениях.

Шаг 5: Закрыть курсор

Когда работа с курсором закончена, его необходимо закрыть, используя

оператор CLOSE. При закрытии курсора происходит освобождение системных

ресурсов. Следующий пример закрывает наш курсор v_product_

cursor:

□ CLOSE v_product_cursor;

В следующем разделе показан полный сценарий, который содержит

все пять шагов.

Полный пример: сценарий product_cursor.sql

Сценарий p ro d u c t_ cu rso r. s q l содержится в каталоге SQL:

--сценарий p ro d u c t_ c u rso r.s q l выводит из таблицы products значения v_

р ro d u c t_ id , v_name

Знакомство с программированием на PL/SQL 363

— и v _ p ric e , используя для этого курсор

SET SERVEROUTPUT ON

DECLARE

- - шаг 1: объявить переменные

v_produ ct_id products.product_id%TYPE;

v_name products.name%TYPE

v _ p ric e products.price%TYPE;

- - шаг 2: объявить курсор

CURSOR v_produ ct_cursor IS

SELECT produ ct_id, name, p r ic e

FROM products

ORDER BY product_id;

BEGIN

— шаг 3: открыть курсор

OPEN v_product_cursor;

LOOP , •

- - шаг 4: выбрать из курсора строки

FETCH v_product_cursor

INTO v_produ ct_id, v_name, v_p rice ;

— выйти из цикла, когда не будет больше строк для чтения, на что указывает

- - логическая переменная v_product_cursor%NOTFOUND (= tru e , когда

- - заканчиваются строки для чтения)

EXIT WHEN v_product_cursor%NOTFOUND;

— используйте для показа переменных DBMS_OUTPUT.PUT_LINE()

DBMS_OUTPUT.PUT_LINE(

'v_ p ro d u ct_ id = ' || v_produ ct_id || ', v_name = ' j j v_name ||

', v _ p ric e = ' || v _ p ric e

);

END LOOP;

— шаг 5: закрыть курсор

CLOSE v_product_cursor;

END;

/

Для выполнения этого сценария нужно проделать следующие шаги.

1. Подключиться к базе данных как store с паролем store_password.

2. Выполнить сценарий product_cursor.sql, используя SQITPlus:

□ SQL> @ C :\SQ L \p ro d u ct_ cu rso r.s q l

Примечание Если сценарий product_.cursor.sql хранится не в папке C:\SQL, а в другом каталоге,

то в предыдущей команде нужно указать имя этого каталога.

Выходные данные сценария product_cursor.sql имеют следующий вид:

364 Глава 11

□ v_produ ct_id = 1,

v_produ ct_id = 2,

v_produ ct_id = 3,

v_produ ct_id = 4,

v_produ ct_id = 5,

v_produ ct_id = 6,

v_produ ct_id = 7,

v_produ ct_id = 8,

v_produ ct_id = 9,

v_produ ct_id = 10

v_produ ct_id = 11

v_produ ct_id = 12

v_name = Modern Science, v _ p ric e = 19,95

v_name = Chemistry, v _ p ric e = 30

v_name = Supernova, v _ p ric e = 25.99