FETCH
Выборка записей с использованием курсора.
Синтаксис
FETCH направление
[ количество_записей ] { IN | FROM } курсор
направление ::- { FORWARD | BACKWARD | RELATIVE }
количество_записей ::={ число \ ALL NEXT PRIOR }
Параметры
- направление. Необязательный параметр, определяющий направление выборки.
Допустимыми значениями являются перечисленные ниже ключевые слова.
- FORWARD. Признак выборки записей, следующих за текущей позицией
курсора. Используется по умолчанию, если направление не указано.
- BACKWARD. Признак выборки записей, предшествующих текущей позиции
курсора.
- RELATIVE. Необязательное ключевое слово, поддерживаемое для совместимости
со стандартом SQL92. В PostgreSQL 7.1.x курсоры производят выборку
только от текущей позиции курсора, поэтому наличие ключевого слова
RELATIVE ни на что не влияет. Учтите, что при использовании ключевого
слова RELATIVE с параметром количество_записей, равным 0, происходит
ошибка (см. ниже пункт «Результаты»).
- количество_записей. Количество записей в выборке. Значение параметра
представляет собой число или одно из следующих ключевых слов:
- ALL — выборка всех записей;
- NEXT — запись, следующая за текущей позицией курсора;
- PRIOR — запись, предшествующая текущей позиции курсора.
- курсор. Имя открытого курсора, используемого для выборки записей.
Результаты
В случае успешного завершения команда FETCH возвращает результаты запроса,
ассоциированного с указанным курсором. Если запрос завершается неудачей,
выводится одно из представленных ниже сообщений.
- NOTICE: PerformPortalFetch: portal "курсор" not found.
Сообщение означает, что курсор с указанным именем не был объявлен. Не
забывайте о том, что перед использованием курсор необходимо объявить
в транзакционном блоке.
- NOTICE: FETCH/ABSOLUTE not supported, using RELATIVE. Попытка выборки
с абсолютным позиционированием (ключевое слово ABSOLUTE вместо RELATIVE).
PostgreSQL не поддерживает абсолютное позиционирование курсора, то есть
перемещение к заданной записи итогового набора (вместо перемещения относительно
текущей позиции курсора).
- ERROR: FETCH/RELATIVE at current position is not supported. Ошибка
— попытка выборки нуля записей с ключевым словом RELATIVE. Это связано
с тем, что в соответствии со стандартом SQL92 синтаксис FETCH RELATIVE
О FROM Курсор должен обеспечивать повторную выборку записи в текущей
позиции курсора. В PostgreSQL этот синтаксис не поддерживается. Без
ключевого слова RELATIVE число 0 интерпретируется как запрос на выборку
всех записей. Но с ключевым словом RELATIVE PostgreSQL предполагает,
что вы пытаетесь использовать синтаксис SQL92, и вместо того, чтобы
вернуть все записи, выводит сообщение об ошибке.
Описание
Команда FETCH возвращает заданное количество записей от текущей позиции
курсора. Курсоры используются только в транзакцнонных блоках, поскольку
возвращаемая ими информация теоретически зависит от действий других пользователей
в системе. Количество записей может быть как положительным, так и отрицательным.
При положительном значении отсчет ведется в направлении, заданном соответствующим
параметром (если параметр не указан, по умолчанию используется параметр
FORWARD).
При отрицательном количестве записей отсчет ведется в направлении, противоположном
заданному. Например, конструкция FORWARD -5 эквивалентна конструкции BACKWARD
5. Если количество записей превышает количество записей в базе, команда
FETCH выбирает все существующие записи в указанном направлении.
ПРИМЕЧАНИЕ
В PostgreSQL 7.1.x не поддерживается обновление данных
с использованием курсоров.
Примеры
В дальнейших примерах используется курсор cur_empl oyee, возвращающий
данные из таблицы employees.
Следующая команда выбирает первые две записи через курсор cur_employee:
booktown=# BEGIN:
BEGIN
booktown=# DECLARE cur_employee CURSOR FOR
booktown-# SELECT firstjiame, lastjiame FROM employees:
SELECT
booktown=# FETCH FORWARD 2 IN cur_employee;
first_name last_name
Vincent | Appel
Michael Holloway
(2 rows)
В следующем примере конструкция BACKWARD -2 (двойное отрицание) также
производит выборку двух записей в прямом направлении:
booktown=# FETCH BACKWARD -2 IN cur_employee:
firstjiame | last_name
David Joble Ben Noble
(2 rows)
Наконец, следующая команда демонстрирует выборку в обратном направлении
через курсор cur_employee.
booktown=# FETCH BACKWARD 3 IN cur_employee;
first_name | last_name
David Joble
Michael Holloway
Vincent Appel
(3 rows) |