FETCH
Получает результат запроса с помощью курсора.
Синтаксис
FETCH [<forward_direction> {FROM | IN}] <cursor_name>
где forward_direction может быть пустым или иметь одно из следующих значений:
NEXT
FIRST
ABSOLUTE <count>
RELATIVE <count>
<count>
ALL
FORWARD
FORWARD <count>
FORWARD ALL
Описание
FETCH получает строки с помощью ранее созданного курсора.
Нельзя использовать FETCH для параллельного курсора (PARALLEL RETRIEVE CURSOR) — для получения строк из него необходимо использовать RETRIEVE.
На этой странице описывается использование курсоров на уровне SQL-команд. При использовании курсоров в функциях PL/pgSQL применяются другие правила.
С курсором связана позиция, которая используется командой FETCH.
Позиция курсора может находиться перед первой строкой результата запроса, на любой конкретной строке результата или после последней строки.
При создании курсор позиционируется перед первой строкой результата.
После получения строк курсор устанавливается на последнюю извлеченную строку.
Если команда FETCH выходит за пределы доступных строк, курсор остается в позиции после последней строки.
Команда FETCH ALL всегда оставляет курсор в позиции после последней строки.
Формы NEXT, FIRST, ABSOLUTE и RELATIVE возвращают одну строку после соответствующего перемещения курсора.
Если такая строка отсутствует, возвращается пустой результат, а курсор остается в позиции перед первой строкой или после последней строки — в зависимости от ситуации.
Формы с FORWARD возвращают указанное количество строк, перемещая курсор вперед и оставляя его на последней возвращенной строке (или после всех строк, если значение count превышает количество доступных строк).
Обратите внимание, что в Greengage DB невозможно перемещать курсор назад, поскольку прокручиваемые курсоры не поддерживаются.
Команда FETCH позволяет перемещать курсор только вперед.
Команды RELATIVE 0 и FORWARD 0 запрашивают текущую строку без перемещения курсора, то есть повторно возвращают последнюю полученную строку.
Операция завершается успешно, если курсор не находится в позиции перед первой строкой или после последней строки; в противном случае строка не возвращается.
Выходные данные
При успешном выполнении команда FETCH возвращает тег команды вида:
FETCH <count>
где count — количество полученных строк (может быть равно нулю).
Обратите внимание, что в psql тег команды не отображается, поскольку вместо него выводятся сами строки результата.
Параметры
| Параметр | Описание |
|---|---|
forward_direction |
Определяет направление выборки и количество возвращаемых строк. В Greengage DB поддерживается только перемещение курсора вперед. Может принимать одно из следующих значений:
|
cursor_name |
Имя открытого курсора |
Примечания
Greengage DB не поддерживает прокручиваемые курсоры, поэтому команду FETCH можно использовать только для перемещения позиции курсора вперед.
Операции ABSOLUTE не дают выигрыша в производительности по сравнению с относительным перемещением, поскольку в обоих случаях требуется последовательная обработка промежуточных строк.
Команда DECLARE используется для объявления курсора.
Для изменения позиции курсора без получения данных используйте команду MOVE.
Примеры
Начало транзакции:
BEGIN;
Создание курсора:
DECLARE mycursor CURSOR FOR SELECT * FROM films;
Получение первых 5 строк из курсора mycursor:
FETCH FORWARD 5 FROM mycursor;
Результат:
code | title | did | date_prod | kind | len -------+-------------------------+-----+------------+----------+------- BL101 | The Third Man | 101 | 1949-12-23 | Drama | 01:44 BL102 | The African Queen | 101 | 1951-08-11 | Romantic | 01:43 JL201 | Une Femme est une Femme | 102 | 1961-03-12 | Romantic | 01:25 P_301 | Vertigo | 103 | 1958-11-14 | Action | 02:08 P_302 | Becket | 103 | 1964-02-03 | Drama | 02:28
Закрытие курсора и завершение транзакции:
CLOSE mycursor;
COMMIT;
Изменение столбца kind таблицы films для строки, на которой находится текущая позиция курсора c_films:
UPDATE films
SET kind = 'Dramatic'
WHERE CURRENT OF c_films;
Совместимость
Стандарт SQL допускает использование курсоров только во встраиваемом SQL и в модулях. Greengage DB также поддерживает использование курсоров в интерактивном режиме.
Описанный здесь вариант FETCH возвращает данные так же, как команда SELECT, а не помещает их в переменные хоста.
За исключением этого, команда FETCH совместима со стандартом SQL с учетом описанных расширений.
Формы FETCH с FORWARD, а также формы FETCH <count> и FETCH ALL, в которых FORWARD подразумевается, являются расширениями Greengage DB.
Вариант BACKWARD не поддерживается.
Стандарт SQL допускает только использование ключевого слова FROM перед именем курсора; возможность использовать IN или опускать ключевое слово является расширением.