SQL для начинающих



       

Открытие курсора



Открытие курсора

Оператор 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 фиксирует значения даты-времени для всех команд, используемых в курсоре.



Содержание раздела