Открытие курсора
Открытие курсора
Оператор DECLARE CURSOR определяет, какие строки включать в курсор, но фактически не инициирует никакого действия, являясь лишь объявлением. Оператор OPEN активизирует курсор. Она имеет следующий вид:
OPEN имя_курсора;
Для открытия курсора, приведенного выше в разделе, посвященном предложению ORDER BY, используйте синтаксис:
DECLARE revenue CURSOR FOR
SELECT Model, Units, Price,
Units * Price AS ExtPrice
FROM TRANSDETAIL
ORDER BY Model, ExtPrice DESC ;
OPEN revenue ;
Помни: До тех пор пока курсор не открыт, осуществлять выборку строк из курсора невозможно. После открытия курсора значения переменных, содержащиеся в операторе DECLARE CURSOR, становятся фиксированными, это же относится к функциям даты-времени. Рассмотрим следующий пример:
DECLARE CURSOR C1 FOR SELECT * FROM ORDERS
WHERE ORDERS.Customer= :NAME
AND DueDate < CURRENT_DATE;
NAME := 'Acme Co' ; //Выражение базового языка
OPEN C1;
NAME := 'Omega Inc.' ; //Другое выражение базового языка
...
UPDATE ORDERS SET DueDate = CURRENT_DATE ;
Оператор OPEN фиксирует значение всех переменных, приведенных в объявлении курсора, а также значения всех функций даты-времени. Поэтому второе присваивание имени переменной (NAME := 'Omega Inc.') не влияет на выбранные курсором строки. Это значение NAME будет использоваться при последующем открытии С1. Если даже команда OPEN выполняется до полуночи, а оператор UPDATE выполняется после, значение CURRENT_DATE в операторе UPDATE вычисляется во время выполнения команды OPEN. Это справедливо даже в том случае, если в операторе DECLARE CURSOR нет функций даты-времени.
Внутренняя фиксация (для значений даты-времени)
Похожая "фиксация" значений даты-времени имеет место при выполнении обычных операторов. Посмотрите пример кода: UPDATE ORDERS SET RecheckDate = CURRENTJDATE WHERE ; Пусть сделано несколько заказов. Выполнение кода начинается за минуту до наступления полночи и продолжается пять или десять минут. Если выражение использует функцию CURRENT_DATE (или TIME, или же TIMESTAMP), значение последней на время выполнения выражения фиксируется. Таким образом, все строки ORDERS имеют дело с одинаковым значением текущей даты. Подобным образом обстоит дело и со значениями типа TIMESTAMP, в выражении используется только одно значение, независимо от того, сколько времени работает выражение. Ниже приведен интересный пример проявления такого правила. UPDATE EMPLOYEE SET KEY CURRENT_TIMESTAMP ; Можно подумать, что выражение присваивает уникальное значение идентификатора каждому сотруднику, однако оно присваивает одно и то же значение в каждой строке. Итак, команда OPEN фиксирует значения даты-времени для всех команд, используемых в курсоре.