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