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 или вообще их опустить является расширением.