Курсоры в PSQL
Курсоры в 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. На момент написания данной книги описание отсутствовало.
. ! .
Более поздняя реализация курсоров, обсуждаемая далее, является более гибкой.