FETCH — извлечение строк из запроса с помощью курсора
FETCH [direction] [ FROM | IN ]cursor_nameгдеdirectionможет принимать одно из следующих значений: NEXT PRIOR FIRST LAST ABSOLUTEcountRELATIVEcountcountALL FORWARD FORWARDcountFORWARD ALL BACKWARD BACKWARDcountBACKWARD 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 функции, правила будут иными — см. Раздел 5.6.7.3.
directiondirection определяет направление выборки и количество извлекаемых строк. Это может быть одно из следующих:
NEXT
Извлечь следующую строку. Это значение по умолчанию, если direction опущено.
PRIORИзвлечь предыдущую строку.
FIRST
Извлечь первую строку запроса (аналогично ABSOLUTE 1).
LAST
Извлечь последнюю строку запроса (аналогично ABSOLUTE -1).
ABSOLUTE count
Извлечь count-ю строку запроса,
или abs(-ю строку от
конца, если count)count отрицательно. Позиционирование
перед первой строкой или после последней строки, если count вне диапазона; в
определенную, ABSOLUTE 0 позиционирует перед
первой строкой.
RELATIVE count
Извлечь countn-ю следующую строку или
abs(n-ю предыдущую
строку, если count)count n
отрицательно. 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Извлекает все предыдущие строки (выполняя сканирование в обратном направлении).
countcount — это
целочисленная константа (возможно, со знаком), определяющая положение или
количество извлекаемых строк. Для FORWARD и
BACKWARD случаев указание отрицательного значения count равносильно изменению
направления FORWARD и BACKWARD.
cursor_nameИмя открытого курсора.
При успешном завершении команда FETCH возвращает метку команды
в формате
FETCH count
Значение count — это количество
извлеченных строк (возможно, нулевое). Обратите внимание, что в
psql, метка команды фактически не будет отображаться, так как psql вместо этого выводятся извлеченные
строки.
Курсор должен быть объявлен с опцией SCROLL
, если планируется использовать любые варианты FETCH
отличные от FETCH NEXT или FETCH FORWARD с
положительным значением count. Для простых запросов
Digital Q.DataBase позволит выполнять выборку в обратном направлении
из курсоров, не объявленных с 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 | название | 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 и countFETCH
ALL, в которых FORWARD подразумевается, являются
Digital Q.DataBase расширениями.
Стандарт SQL допускает только FROM предшествующий имени курсора; возможность использования IN, или их полное отсутствие, является расширением.