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