Курсоры в PSQL

We use cookies. Read the Privacy and Cookie Policy

Курсоры в PSQL

Курсоры состоят из трех основных элементов:

* набора строк, определенных выражением SELECT;

* указателя, который перемещается через набор от первой строки к последней, изолируя строку для некоторого вида деятельности;

* набора переменных- определенных как локальные переменные, выходные аргументы или и те, и другие, - для получения значения столбцов, возвращаемых каждой строкой при ссылке на них указателя.

Проход указателя через набор может рассматриваться как операция "цикла". Операции, выполняющиеся в процессе этого "цикла", когда указатель ссылается на строку, могут быть простыми или сложными.

PSQL имеет две реализации курсора, одна хорошо известная, а другая не была ранее документирована.

* Хорошо известная реализация представлена конструкцией FOR ... SELECT, которая полностью реализует синтаксис цикла и широко используется в процедурах выбора. Она подробно обсуждается в следующем разделе. При этом также допустимо выполнение цикла курсора FOR ... SELECT и внутри выполняемых процедур, как мы видели в предыдущем примере.

* Менее известной реализацией является ранняя реализация, иногда называемая изменяемым или именованным курсором, которая была наследована от ESQL и долгое время была осуждаема. Она представляет объект курсор и позволяет выполнять изменения и удаления. Ее синтаксис будет более понятен тем, кто использовал курсоры в языках процедур в других СУБД. Сейчас мы его вкратце рассмотрим.

! ! !

ПРИМЕЧАНИЕ. Синтаксис и механизм именованного курсора были заново реализованы в процессе разработки Firebird 2. Это краткое описание является лебединой песней старых курсоров, поскольку новый синтаксис вряд ли будет совместимым со старым.

. ! .

"Старый" изменяемый курсор

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

. . .

FOR SELECT <список-столбцов>

FROM <имя-таблицы>

FOR UPDATE

INTO <переменные>

AS CURSOR <имя-курсора>

DO

/* либо UPDATE ... */

BEGIN

UPDATE <имя-таблицы>

SET ... WHERE CURRENT OF <имя-курсора>;

. . .

END

/* или DELETE */

BEGIN

DELETE FROM <имя-таблицы>

WHERE CURRENT OF <имя-курсора>

END

. . .

Используйте его сейчас, но ждите изменений в более поздних версиях Firebird. Это очень быстрый способ добавить множество операций в хранимую процедуру, поскольку здесь используется RDB$DB_KEY для локализации записей. RDB$DB_KEY (или просто DBKEY) является внутренней возможностью, которая может быть использована во множестве ситуаций. См. разд. "Темы оптимизации: использование внутреннего RDB$DBKEY".

! ! !

СОВЕТ. Просмотрите заметки по релизу для нового синтаксиса курсора PSQL. На момент написания данной книги описание отсутствовало.

. ! .

Более поздняя реализация курсоров, обсуждаемая далее, является более гибкой.