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