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 число

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

Примечания

Если перемещение курсора в 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