Содержание
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
