FETCH

FETCH — получить результат запроса с помощью курсора


Синтаксис

FETCH [ направление [ FROM | IN ] ] имя_курсора

где направлением может быть:

    NEXT
    PRIOR
    FIRST
    LAST
    ABSOLUTE число
    RELATIVE число
    число
    ALL
    FORWARD
    FORWARD число
    FORWARD ALL
    BACKWARD
    BACKWARD число
    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, правила будут отличаться — см. подраздел Курсоры.


Параметры

направление

Параметр направление определяет направление движения и количество извлекаемых строк. Может принимать одно из следующих значений:

  • NEXT
    Извлечь следующую строку. Это действие по умолчанию, если направление опущено.

  • PRIOR
    Извлечь предыдущую строку.

  • FIRST
    Извлечь первую строку запроса (аналогично ABSOLUTE 1).

  • LAST
    Извлечь последнюю строку запроса (аналогично ABSOLUTE -1).

  • ABSOLUTE число
    Извлечь строку под номером число с начала либо под номером abs(число) с конца, если число отрицательно. Если число выходит за границы диапазона строк, курсор размещается перед первой или после последней строки; в частности, с ABSOLUTE 0 курсор оказывается перед первой строкой.

  • RELATIVE число
    Извлечь строку под номером число, считая со следующей вперед, либо под номером abs(число), считая с предыдущей назад, если число отрицательно. RELATIVE 0 повторно извлекает текущую строку, если таковая имеется.

  • число
    Извлечь следующее число строк (аналогично FORWARD число).

  • ALL
    Извлечь все оставшиеся строки (аналогично FORWARD ALL).

  • FORWARD
    Извлечь следующую строку (аналогично NEXT).

  • FORWARD число
    Извлечь следующее число строк. FORWARD 0 повторно извлекает текущую строку.

  • FORWARD ALL
    Извлечь все оставшиеся строки.

  • BACKWARD
    Извлечь предыдущую строку (аналогично PRIOR).

  • BACKWARD число
    Извлечь предыдущее число строк (сканируя в обратном направлении). BACKWARD 0 повторно извлекает текущую строку.

  • BACKWARD ALL
    Извлечь все предыдущие строки (сканируя в обратном направлении).

число

Здесь число — это целочисленная константа, возможно, со знаком, определяющая положение или количество выбираемых строк. Для вариантов FORWARD и BACKWARD указание отрицательного числа равнозначно смене направления FORWARD на BACKWARD и наоборот.

имя_курсора

Имя открытого курсора.


Выводимая информация

При успешном выполнении FETCH возвращает метку команды вида

FETCH число

Где число — количество извлеченных строк (возможно, ноль). Обратите внимание, что в psql метка команды на самом деле не выдается, так как psql отображает вместо этого извлеченные строки.


Примечания

Если пользователь намеревается использовать варианты FETCH, отличные от FETCH NEXT или FETCH FORWARD с положительным числом, курсор следует объявить с параметром SCROLL. Для простых запросов QHB позволит выполнять обратное извлечение из курсоров, объявленных без SCROLL, но на такое поведение лучше не полагаться. Если курсор объявлен с параметром NO SCROLL, обратное извлечение не допускается.

Извлечение с ABSOLUTE нисколько не быстрее, чем переход к нужной строке с относительным перемещением: нижележащая реализация в любом случае должна пройти все промежуточные строки. Отрицательные абсолютные извлечения еще хуже: запрос должен быть прочитан до конца, чтобы найти последнюю строку, а затем оттуда вернуться к указанной строке. Тем не менее перемотка к началу запроса (как в случае с FETCH ABSOLUTE 0) идет быстро.

Для определения курсора применяется команда DECLARE, а для изменения его позиции без считывания данных — команда MOVE.


Примеры

Следующий пример демонстрирует перемещение курсора в таблице:

BEGIN WORK;

-- Установка курсора:
DECLARE liahona SCROLL CURSOR FOR SELECT * FROM films;

-- Извлечение первых 5 строк в курсоре 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 PRIOR FROM liahona;

 code  |  title  | did | date_prod  |  kind  |  len
-------+---------+-----+------------+--------+-------
 P_301 | Vertigo | 103 | 1958-11-14 | Action | 02:08

-- Закрытие курсора и завершение транзакции:
CLOSE liahona;
COMMIT WORK;

Совместимость

Стандарт SQL определяет команду FETCH для использования только для встраиваемого SQL. Вариант FETCH, описанный здесь, возвращает данные, как если бы это был результат SELECT, а не помещает их в переменные хоста. В остальном FETCH имеет полную прямую совместимость со стандартом SQL.

Формы FETCH с указанием FORWARD и BACKWARD, а также формы FETCH число и FETCH ALL (в которых FORWARD неявно подразумевается) являются расширениями QHB.

В стандарте SQL перед именем курсора допускается только указание FROM; возможность указать IN или опустить оба указания является расширением.


См. также

CLOSE, DECLARE, MOVE