Курсоры
Синтаксис
Синтаксис оператора FETCH имеет следующий вид:
FETCH [[ориентация] FROM] имя_курсора INTO целевая_спвцификация [,целевая_спецификация]…;
Существуют шесть вариантов ориентации:
- NEXT
- PRIOR
- FIRST
- LAST
- ABSOLUTE
- RELATIVE
- <Спецификация_простого_значения>
По умолчанию используется NEXT – единственно возможное значение параметра ориентации в SQL до версии SQL-92. Где бы ни находился курсор, он перемещается на следующую строку в порядке, установленном выражением запроса. Если курсор расположен перед первой записью, он завершает свое выполнение на первую запись. Если он указывает на запись п, то перемещается к записи 77+1. Если курсор указывает на последнюю запись, он прекращает свою работу и в системную переменную SQLSTATE помещается код отсутствия данных. Переменная SQLSTATE, а также остальные средства обработки ошибок в SQL рассматриваются в главе 20.
Целевыми спецификациями являются либо базовые переменные, либо параметры, в зависимости от того, определен ли курсор во встроенном SQL или в модуле. Количество и типы целевых спецификаций должны соответствовать количеству и типам столбцов, используемых в выражении запроса оператора DECLARE CURSOR. В случае встроенного SQL, если из строки таблицы выбирается список из пяти значений, в выражении запроса должны фигурировать пять переменных с правильно выбранными типами для хранения этих значений.
Ориентация перемещаемого курсора
Вследствие того, что в SQL курсор может быть перемещаемым, помимо NEXT можно использовать и другие значения параметра ориентации. После перемещения с ориентацией PRIOR курсор перемещается к предыдущей строке. В случае ориентации FIRST курсор перемещается к первой записи, а в случае ориентации LAST – к последней записи выборки.
Задание ориентации в виде числа требует присутствия команд ABSOLUTE и RELATIVE. Например, FETCH ABSOLUTE 7 перемещает курсор на седьмую строку от начала выборки. FETCH RELATIVE 7 перемещает курсор на семь строк ниже его текущей позиции. FETCH RELATIVE 0 не перемещает курсор.
Оператор FETCH RELATIVE 1 производит такое же действие, что и FETCH NEXT; FETCH RELATIVE-1 действует таким же образом, что и FETCH PRIOR; FETCH ABSOLUTE 1 выбирает первую запись; FETCH ABSOLUTE 2 – вторую запись и т.д. Аналогично, FETCH ABSOLUTE – 1 предоставляет последнюю запись, a FETCH ABSOLUTE – 2 – предшествующую последней записи выборки и т.д. Оператор FETCH ABSOLUTE 0 генерирует исключение отсутствия данных, таким же образом действует FETCH ABSOLUTE 17, если в выборке только 16 строк. Оператор FETCH <спецификация_простого_значения> возвращает запись, заданную спецификацией простого значения.
Позиционные операторы DELETE и UPDATE
Со строками, на которые в данный момент указывает курсор, можно выполнять операции удаления и обновления. Синтаксис оператора DELETE следующий:
DELETE FROM имя_таблицы WHERE CURRENT OF имя_курсора;
Если курсор не указывает на строку, генерируется ошибка, и удаление не происходит. Вот синтаксис оператора UPDATE:
UPDATE имя_таблицы SET имя_столбца = значение [,имя_столбца = значение]… WHERE CURRENT OF имя_курсора;
Значение, помещаемое в каждый выбранный столбец, должно являться выражением, ключевым словом или ключевым словом DEFAULT. Если при проведении операции обновления возникает какая-либо ошибка, обновление не выполняется.
Закрытие курсора
Совет:
Закончив работу с курсором, тут же закройте его. Курсоры, оставшиеся открытыми после того, как приложение закончило свою работу с ними, как правило, безобидны, но опять-таки не всегда. Кроме того, открытые курсоры используют системные ресурсы.
По окончании работы "нечувствительного" курсора и его закрытия достаточно повторно открыть этот курсор, и он сможет работать с измененными данными.