FETCH#

FETCH

FETCH

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, извлекают указанное количество строк, перемещаясь вперед или назад, оставляя курсор на последней возвращенной строке (или после/до всех строк, если количество 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 или вообще его опустить является расширением.

См. также

CLOSE, DECLARE, MOVE