FETCH
Эта страница переведена при помощи нейросети GigaChat.
FETCH
- получение результата запроса через курсор.
Синтаксис
FETCH [ direction ] [ FROM | IN ] cursor_name
where direction can be one of:
NEXT
PRIOR
FIRST
LAST
ABSOLUTE count
RELATIVE count
count
ALL
FORWARD
FORWARD count
FORWARD ALL
BACKWARD
BACKWARD count
BACKWARD ALL
Описание
FETCH
получает строки через ранее созданный курсор.
Курсор связан с определенным положением, которая используется командой FETCH
. Позиция курсора может находиться:
- до первой строки результата запроса;
- на любой конкретной строке результата;
- после последней строки.
При создании курсор устанавливается до первой строки. После извлечения некоторых строк курсор будет установлен на последнюю извлеченную строку. Если FETCH
доходит до конца доступных строк, курсор будет установлен после последней строки, либо до первой строки, если происходит обратное извлечение.
Команды FETCH ALL
или FETCH BACKWARD ALL
всегда оставляют курсор установленным после последней строки или до первой строки, соответственно.
Формы NEXT
, PRIOR
, FIRST
, LAST
, ABSOLUTE
, RELATIVE
извлекают одну строку, при этом курсор передвигается соответствующим образом. Если такой строки не существует, возвращается пустой результат, а курсор устанавливается до первой строки или после последней строки, как это уместно.
Формы с использованием FORWARD
и BACKWARD
извлекают указанное количество строк, перемещаясь вперед или назад, и оставляют курсор установленным на последней возвращенной строке (или после/до всех строк, если количество превышает доступное).
RELATIVE 0
, FORWARD 0
и BACKWARD 0
запрашивают извлечение текущей строки без перемещения курсора, то есть повторное извлечение самой недавно извлеченной строки. Это будет успешно выполнено, если только курсор не установлен перед первой строкой или после последней строки. В этом случае строка не возвращается.
Эта страница описывает использование курсоров на уровне SQL-команд. Если используются курсоры внутри функции PL/pgSQL, действуют другие правила — смотрите раздел «Использование курсоров» документации PostgreSQL.
Параметры
direction
- Определяет направление перемещения курсора и количество строк для извлечения. Может принимать следующие значения:
NEXT
: Извлекает следующую строку. Это поведение по умолчанию, если параметрdirection
опущен.PRIOR
: Извлекает предыдущую строку.FIRST
: Извлекает первую строку запроса (то же самое, чтоABSOLUTE 1
).LAST
: Извлекает последнюю строку запроса (то же самое, чтоABSOLUTE -1
).ABSOLUTE count
: Извлекает строку с номеромcount
, либоabs(count)
с конца, еслиcount
отрицательное. Еслиcount
вне допустимого диапазона, курсор устанавливается до первой или после последней строки. Например,ABSOLUTE 0
устанавливает курсор до первой строки.RELATIVE count
: Извлекает следующую строку с номеромcount
, либо предыдущую строкуabs(count)
, еслиcount
отрицательное.RELATIVE 0
означает повторное извлечение текущей строки, если таковая имеется.count
: Извлекает следующиеcount
строки (то же самое, что иFORWARD count
).ALL
: Извлекает все оставшиеся строки (то же самое, какFORWARD ALL
).FORWARD
: Извлекает следующую строку (то же самое, какNEXT
).FORWARD count
: Извлекает следующиеcount
строки.FORWARD 0
повторно извлекает текущую строку.FORWARD ALL
: Извлекает все оставшиеся строки.BACKWARD
: Извлекает предыдущей строки (то же самое, что иPRIOR
).BACKWARD count
: Извлекает предыдущиеcount
строки (сканирование назад).BACKWARD 0
повторно извлекает текущую строку.BACKWARD ALL
: Извлекает все предыдущие строки (сканирование назад).
count
- Задает целое число (может быть отрицательным), определяет номер строки (
ABSOLUTE
,RELATIVE
) или количество строк (FORWARD
,BACKWARD
).
cursor_name
- Задает имя открытого курсора.
Выводимая информация
При успешном выполнении FETCH
возвращает тег команды следующего вида:
FETCH count
где count
— количество извлеченных строк (возможно, ноль).
Обратите внимание, что в клиенте psql
этот тег не отображается, так как вместо этого показываются сами извлеченные строки.
Примечания
Курсор должен быть объявлен с параметром SCROLL
, если планируется использовать какие-либо формы FETCH
, кроме FETCH NEXT
или FETCH FORWARD
с положительным количеством.
Для простых запросов PostgreSQL позволяет обратное извлечение и без SCROLL
, но полагаться на это поведение не рекомендуется. Если курсор объявлен с NO SCROLL
, обратное извлечение запрещено.
Извлечение с помощью ABSOLUTE
не быстрее, чем навигация с использованием RELATIVE
: реализация все равно должна пройти все промежуточные строки. Отрицательные значения в ABSOLUTE
— еще медленнее: сначала запрос читается до конца, чтобы найти последнюю строку, а затем перемещается назад оттуда. Однако возврат в начало запроса, например FETCH ABSOLUTE 0
, быстр.
Курсоры создаются командой DECLARE. Для перемещения курсора без извлечения данных используйте команду MOVE.
Примеры
В следующем примере используется курсор для обхода таблицы:
BEGIN WORK;
-- Set up a cursor:
DECLARE liahona SCROLL CURSOR FOR SELECT * FROM films;
-- Fetch the first 5 rows in the cursor liahona:
FETCH FORWARD 5 FROM liahona;
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
-- Fetch the previous row:
FETCH PRIOR FROM liahona;
code | title | did | date_prod | kind | len
-------+---------+-----+------------+--------+-------
P_301 | Vertigo | 103 | 1958-11-14 | Action | 02:08
-- Close the cursor and end the transaction:
CLOSE liahona;
COMMIT WORK;
Совместимость
Стандарт SQL определяет FETCH
только для встроенного SQL. Вариант FETCH
, описанный здесь, возвращает данные так, как если бы они были результатом SELECT
, а не размещались в переменных хоста. За исключением этого момента, FETCH
полностью совместим со стандартом SQL.
Формы, включающие FETCH
и FORWARD
, а также формы FETCH count
и FETCH ALL
, в которых FORWARD
подразумевается, являются расширениями PostgreSQL.
Стандарт SQL допускает только FROM
перед именем курсора, возможность использовать IN
или вообще их опустить является расширением.