FirebirdSQL logo

FETCH, OFFSET

Предложения FETCH и OFFSET являются SQL:2008 совместимым эквивалентом предложениям FIRST/SKIP и альтернативой предложению ROWS.Предложение OFFSET указывает, какое количество строк необходимо пропустить.Предложение FETCH указывает, какое количество строк необходимо получить.

Предложения OFFSET и FETCH могут применяться независимо уровня вложенности выражений запросов.

Синтаксис
SELECT <columns> FROM ...
  [WHERE ...]
  [ORDER BY ...]
  [OFFSET <offset-fetch-expression> {ROW | ROWS}]
  [FETCH {FIRST | NEXT} [ <offset-fetch-expression> ] { ROW | ROWS } ONLY]

<offset-fetch-expression>  ::=
    <integer-literal>
  | <query-parameter>
Table 1. Параметры предложений OFFSET и FETCH
Параметр Описание

integer-literal

Целочисленный литерал

query-parameter

Парамер запрос.? в DSQL и :paramname в PSQL

Note
  • Firebird не поддерживает указание FETCH в процентах, определённое в стандарте.

  • Firebird не поддерживает предложение FETCH с опцией WITH TIES, которая определена в стандарте.

  • FIRST …​ SKIP и ROWS являются нестандартными альтернативами.

  • Предложения OFFSET и/или FETCH не могут быть объединены с предложениями ROWS или FIRST/SKIP в одном выражении запроса.

  • Выражения, ссылки на столбцы и т.д. недопустимы в любом из предложений.

  • В отличие от предложения ROWS, предложения OFFSET и FETCH допустимы только в операторе SELECT.

Примеры использования OFFSET и FETCH

Следующий запрос возвращает все строки кроме первых 10, упорядоченных по столбцу COL1:

SELECT *
FROM T1
ORDER BY COL1
OFFSET 10 ROWS

В этом примере возвращается первые 10 строк, упорядоченных по столбцу COL1:

SELECT *
FROM T1
ORDER BY COL1
FETCH FIRST 10 ROWS ONLY

Использование предложений OFFSET и FETCH в производной таблице, результат которой ограничивается ещё раз во внешнем запросе.

SELECT *
FROM (
  SELECT *
  FROM T1
  ORDER BY COL1 DESC
  OFFSET 1 ROW
  FETCH NEXT 10 ROWS ONLY
) a
ORDER BY a.COL1
FETCH FIRST ROW ONLY
См. также:

ROWS, "FIRST, SKIP".

FOR UPDATE [OF]

Синтаксис
SELECT ...
  FROM single_table
  [WHERE ...]
  [FOR UPDATE [OF <column-names>]]

Предложение FOR UPDATE не делает то, что от него ожидается.В настоящее время единственный эффект от его использования заключается лишь в отключении упреждающей выборки в буфер.

Tip

Это, вероятно, изменится в будущем: план состоит в том, чтобы проверять курсоры, отмеченные как FOR UPDATE, действительно ли они обновляемые, и отклонять позиционированные обновления и удаления для курсоров, оцененных как не обновляемый.

Предложение OF не делает ничего вообще.

WITH LOCK

Назначение

Пессимистическая блокировка.

Доступно

DSQL, PSQL

Синтаксис
SELECT ...
FROM single_table
[WHERE ...]
[FOR UPDATE [OF <column-names>]]
WITH LOCK [SKIP LOCKED]

Опция WITH LOCK, обеспечивает возможность ограниченной явной пессимистической блокировки для осторожного использования в затронутых наборах строк:

  1. крайне малой выборки (в идеале из одной строки) и

  2. при контроле из приложения.

Caution
Только для экспертов

Пессимистическая блокировка редко требуется при работе с Firebird.Эту функцию можно использовать только хорошо понимая её.

Требуется хорошее знание различных уровней изоляции и других параметров транзакций прежде чем использовать явную блокировку в вашем приложении.

При успешном выполнении предложения WITH LOCK будут заблокированы выбранные строки данных и таким образом запрещён доступ на их изменение в рамках других транзакций до момента завершения вашей транзакции.

Предложение WITH LOCK доступно только для выборки данных (SELECT) из одной таблицы.Предложение WITH LOCK нельзя использовать:

  • в подзапросах;

  • в запросах с объединением нескольких таблиц (JOIN);

  • с оператором DISTINCT, предложением GROUP BY и при использовании любых агрегатных функций;

  • при работе с представлениями;

  • при выборке данных из селективных хранимых процедур;

  • при работе с внешними таблицами.

Сервер, в свою очередь, для каждой записи, подпадающей под явную блокировку, возвращает версию записи, которая является в настоящее время подтверждённой (актуальной), независимо от состояния базы данных, когда был выполнен оператор выборки данных, или исключение при попытке обновления заблокированной записи.

Ожидаемое поведение и сообщения о конфликте зависят от параметров транзакции, определённых в TPB (Transaction Parameters Block):

Table 1. Влияние параметров TPB на явную блокировку
Режим TPB Поведение

isc_tpb_consistency

Явные блокировки переопределяются неявными или явнымиблокировками табличного уровня и игнорируются.

isc_tpb_concurrency + isc_tpb_nowait

При подтверждении изменения записи в транзакции, стартовавшейпосле транзакции, запустившей явную блокировку, немедленновозникает исключение конфликта обновления.

isc_tpb_concurrency + isc_tpb_wait

При подтверждении изменения записи в транзакции, стартовавшей после транзакции, запустившей явную блокировку, немедленно возникает исключение конфликта обновления.Если в активной транзакции идёт редактирование записи (с использованием явной блокировки или нормальной оптимистической блокировкой записи), то транзакция, делающая попытку явной блокировки, ожидает окончания транзакции блокирования и, после её завершения, снова пытается получить блокировку записи.Это означает, что при изменении версии записи и подтверждении транзакции с блокировкой возникает исключение конфликта обновления.

isc_tpb_read_committed + isc_tpb_nowait

Если есть активная транзакция, редактирующая запись (сиспользованием явной блокировки или нормальной оптимистическойблокировкой записи), то сразу же возникает исключение конфликтаобновления.

isc_tpb_read_committed + isc_tpb_wait

Если в активной транзакции идёт редактирование записи (с использованием явной блокировки или нормальной оптимистической блокировкой записи), то транзакция, делающая попытку явной блокировки, ожидает окончания транзакции блокирования и, после её завершения, снова пытается получить блокировку записи.

Для этого режима TPB никогда не возникает конфликта обновления.