Самоучитель по SQL-сервер в Linux



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)




Книжный магазин