FETCH#
FETCH
FETCH — извлечение строк из запроса с использованием курсора
Синтаксис
FETCH [direction
] [ FROM | IN ]cursor_name
wheredirection
can be one of: NEXT PRIOR FIRST LAST ABSOLUTEcount
RELATIVEcount
count
ALL FORWARD FORWARDcount
FORWARD ALL BACKWARD BACKWARDcount
BACKWARD ALL
Описание
FETCH
извлекает строки с использованием ранее созданного курсора.
У курсора есть связанная позиция, которая используется командой FETCH
. Позиция курсора может быть перед первой строкой результата запроса, на определенной строке результата или после последней строки результата. При создании курсора он позиционируется перед первой строкой. После извлечения нескольких строк курсор позиционируется на последней извлеченной строке. Если команда FETCH
достигает конца доступных строк, то курсор остается позиционированным после последней строки или перед первой строкой при извлечении в обратном порядке. Команды FETCH ALL
или FETCH BACKWARD ALL
всегда оставляют курсор позиционированным после последней строки или перед первой строкой.
Формы NEXT
, PRIOR
, FIRST
,
LAST
, ABSOLUTE
, RELATIVE
извлекают
одну строку после соответствующего перемещения курсора. Если такой строки нет,
возвращается пустой результат, и курсор остается расположенным перед первой строкой
или после последней строки, как это необходимо.
Формы, использующие FORWARD
и BACKWARD
, извлекают указанное количество строк, перемещаясь вперед или назад, оставляя курсор на последней возвращенной строке (или после/до всех строк, если количество count
превышает количество доступных строк).
RELATIVE 0
, FORWARD 0
и
BACKWARD 0
запрашивают текущую строку без перемещения курсора, то есть повторное получение
последней полученной строки. Это будет успешно, если курсор находится после
первой строки или после последней строки; в этом случае ни одна строка не возвращается.
Примечание
Эта страница описывает использование курсоров на уровне команд SQL. Если вы пытаетесь использовать курсоры внутри функции PL/pgSQL, правила отличаются — см. Раздел 40.7.3.
Параметры
direction
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
count
- это возможно знаковая целочисленная константа, определяющая местоположение или количество выбираемых строк. Для случаевFORWARD
иBACKWARD
, указание отрицательного значенияcount
эквивалентно изменению направленияFORWARD
иBACKWARD
.cursor_name
Имя открытого курсора.
Выводы
При успешном выполнении команды FETCH
возвращается тег команды в следующем формате:
FETCH count
count
- это количество выбранных строк (возможно, ноль). Обратите внимание, что в psql тег команды фактически не будет отображаться, так как psql отображает выбранные строки вместо него.
Примечания
Курсор должен быть объявлен с опцией SCROLL
, если вы планируете использовать любые варианты FETCH
кроме FETCH NEXT
или FETCH FORWARD
с положительным счетчиком. Для простых запросов Tantor BE позволяет выполнять обратные выборки из курсоров, не объявленных с SCROLL
, но на это лучше не полагаться. Если курсор объявлен с опцией NO SCROLL
, обратные выборки не разрешены.
Все запросы 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
и BACKWARD
, а также формы FETCH
и count
FETCH
ALL
, в которых FORWARD
подразумевается, являются
расширениями Tantor BE.
Стандарт SQL позволяет использовать только FROM
перед именем курсора; возможность использовать IN
или вообще его опустить является расширением.