Инструменты пользователя

Инструменты сайта


Боковая панель

Введение

Статьи и часто задаваемые вопросы

Установка и настройка

Обработка ошибок

Полезные запросы SQL

Тематические группы

fetch

FETCH

Версии сервера

Для DSQL варианта оператора

0.9 1.0 1.5.3 1.5.4 1.5.5 2.0 2.0.3 2.0.4 2.1 2.5 3.0
- - Да Да Да Да Да Да Да Да Да

Для PSQL варианта оператора

0.9 1.0 1.5.3 1.5.4 1.5.5 2.0 2.0.3 2.0.4 2.1 2.5 3.0
- - - - - Да Да Да Да Да Да

Доступно в

Формат

SQL:

FETCH cursor
[INTO :hostvar [[INDICATOR] :indvar]
    [, :hostvar [[INDICATOR] :indvar] ...]];

DSQL:

FETCH cursor {INTO | USING} SQL DESCRIPTOR xsqlda

Для BLOB: FETCH(BLOB)

Аргумент Описание
cursor Имя открытого курсора из которого выбираются строки.
:hostvar Переменная базового языка, чтобы сохранить значения возвращенные с помощью FETCH.
:invar Индикаторная переменная, для сообщения, что столбец содержит неизвестное или NULL значение.
[INTO USING] SQL DESCRIPTOR Определяет, что значения должны быть возвращены в определенном XSQLDA. xsqlda XSQLDA переменная базового языка.

PSQL:

FETCH <cursor_name> INTO <var_name> [, <var_name> ...];
Аргумент Описание
<cursor_name> Имя открытого курсора, объявленного DECLARE CURSOR, из которого выбираются строки.
<var_name> Определяет переменные, в которые будет помещен результат очередного FETCH

Описание

FETCH возвращает одну строку за один раз в программу из активного набора курсора. Первая операция FETCH возвращает первую строку из активного набора. Последующие инструкции FETCH перемещает курсор по активному набору возвращая по одной строке за один раз, пока не станет невозможным найти строку и SQLCODE не вернет значение 100.

Курсор это односторонний указатель на упорядоченный набор строк возвращаемых выражением SELECT в инструкции DECLARE CURSOR. Курсор позволяет последовательный доступ к отысканным строкам. Существует четыре связанных инструкции для работы с курсором:

Стадия Инструкция Назначение
1 DECLARE CURSOR Объявляет курсор. Инструкция SELECT определяет строки возвращаемые для курсора.
2 OPEN Отыскивает строки определенные, чтобы вернуть, с помощью DECLARE CURSOR. Результирующие строки становятся текущим набором курсора.
3 FETCH Возвращает текущую строку из текущего набора, начиная с первой строки.
4 CLOSE Закрывает курсор и освобождает системные ресурсы.

Количество, размер, тип данных и порядок столбцов в FETCH должно быть таким же, как перечислено в выражении запроса в соответствующей инструкции DECLARE CURSOR.

Эта инструкция может быть использована в SQL, в DSQL и в PSQL.

:!: Для работы с курсорами в PSQL нужно использовать Firebird v2.0 и выше

:!: Важные замечания для работы с FETCH, OPEN, CLOSE, DECLARE CURSOR в PSQL:

замечание
1 Объявление курсора как переменной DECLARE CURSOR разрешается только в области объявления переменных DECLARE VARIABLE PSQL-блока/хранимой процедуры/триггера.
2 Cursor names are required to be unique in the given context. They cannot interfere with FOR SELECT cursor (declared via the AS CURSOR clause) names. But a cursor can share its name with any variable in this context, as possible operations are different.
3 Positioned updates and deletes with cursors using the WHERE CURRENT OF clause are allowed.
4 Попытки извлечения данных или закрытия (вызова оператора CLOSE) FOR SELECT курсора запрещены !
5 Попытки открыть курсор, который уже открыт при помощи оператора OPEN, а равно, как и попытки FETCH из закрытого курсора, который не был открыт при помощи оператора OPEN или закрыт оператором CLOSE, будут неудачными.
6 Все курсоры, котрые не были явно закрыты при помощи оператора CLOSE при выходе из PSQL-блока/хранимой процедуры/триггера автоматически закрываются
7 Системная контекстная переменная ROW_COUNT может быть использована для проверки, вернул ли очередной FETCH строку

Пример

SQL: Следующая внедренная инструкция SQL выбирает столбец из активного набора курсора:

EXEC SQL
  FETCH PROJ_CNT INTO :department, :hcnt;

PSQL: Следующий пример показывает принципы работы с FETCH, DECLARE CURSOR, OPEN, CLOSE, ROW_COUNT в ProcedureSQL.

SET TERM !!;
 
CREATE OR ALTER PROCEDURE GET_RELATIONS_NAMES 
RETURNS(
  RNAME CHAR(31)
)AS
  DECLARE C CURSOR FOR (SELECT RDB$RELATION_NAME FROM RDB$RELATIONS);
BEGIN
  OPEN C;
  WHILE (1 = 1) DO
  BEGIN
    FETCH C INTO :RNAME;
    IF(ROW_COUNT = 0)THEN
      LEAVE;
    SUSPEND;
  END
  CLOSE C;
END!!
 
SET TERM ;!!

PSQL: Следующий пример показывает преимущество курсоров, так как можно проходить по нескольким курсорам параллельно.

EXECUTE block RETURNS (id INT, id1 INT, id2 INT)
AS
DECLARE variable master_id INT;
DECLARE variable rc INT;
DECLARE d1 cursor FOR (SELECT id FROM detail1 WHERE master_id=:master_id);
DECLARE d2 cursor FOR (SELECT id FROM detail2 WHERE master_id=:master_id);
BEGIN
  FOR SELECT id FROM master INTO master_id
  do BEGIN
    id=master_id;
    OPEN d1; OPEN d2;
    while (0=0) do BEGIN
      rc=0;
      fetch d1 INTO id1;
      IF (ROW_COUNT=0) THEN id1=NULL;
      rc=ROW_COUNT;
 
      fetch d2 INTO id2;
      IF (ROW_COUNT=0) THEN id2=NULL;
      rc=rc+ROW_COUNT;
 
 
      IF (rc=0) THEN BEGIN
        IF (id=master_id) THEN suspend; -- если нет деталей, всё равно вывод
        leave;
      END
      ELSE suspend;
      IF (id=master_id) THEN id=NULL;
    END
    close d1; close d2;
  END
END

См. также

Источник

langref.pdf

Только авторизованные участники могут оставлять комментарии.
fetch.txt · Последние изменения: 2008/06/27 09:48 (внешнее изменение)