Иллюстрированный самоучитель по SQL для начинающих

Курсоры

Перемещаемость

Понятие перемещаемость (scrollability) впервые появилось в SQL-92. В реализациях, поддерживаемых SQL-86 и SQL-89. единственным разрешенным перемещением курсора было последовательное, начиная с первой строки, выбранной выражением запроса, и заканчивая последней строкой. Ключевое слово SCROLL оператора DECLARE CURSOR в SQL-92 (и в SQL:2OO3) позволяет получить доступ к строкам в любом порядке по вашему желанию. Синтаксис оператора FETCH контролирует перемещение курсора. Оператор FETCH мы рассмотрим ниже в этой главе.

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

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

Выборка данных из отдельных строк

Оператор DECLARE CURSOR определяет название курсора и область его действия, оператор OPEN собирает все строки таблицы, удовлетворяющие выражению запроса DECLARE CURSOR, оператор FETCH осуществляет непосредственную выборку данных. Курсор может указывать на одну строку в области действия курсора, или на область, которая находится перед первой строкой области действия, или же на область, расположенную за последней строкой области действия курсора, или на границу строк. Определить, на что именно указывает курсор, можно, используя предложение ориентации оператора FETCH.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.