Стандарты языка реляционных баз данных SQL: краткий обзор - Некоторые черты SQL/92. Часть 4
ОГЛАВЛЕНИЕ
4. 1. 10 Оператор объявления курсора над динамически подготовленным оператором выборки
Оператор определяется следующим синтаксисом:
<dynamic declare cursor> ::=
DECLARE <cursor name> [INSENSITIVE] [SCROLL]
CURSOR FOR <statement name>
как определяется в новом стандарте, для всех операторов DECLARE CURSOR курсоры фактически создаются при начале транзакции и уничтожаются при ее завершении. Заметим, что в этом операторе <cursor name> и <statementname> прямо (литерально) заданные идентификаторы.
4. 1. 11 Другая разновидность оператора определения курсора над динамически подготовленным оператором выборки
Для этого оператора действуют следующие синтаксические правила:
<allocate cursor statement> ::=
ALLOCATE <extended cursor name> [INSENSITIVE] [SCROLL]
CURSOR FOR <extended statement name>
<extended cursor name> ::=
[<scope option>] <simple value specification>
Курсоры, определяемые с помощью оператора ALLOCATE CURSOR, фактически создаются при выполнении такого оператора и уничтожаются при выполнении оператора DEALLOCATE PREPARE или при конце транзакции. В этом операторе имена курсора и подготовленного оператора SQL могут задаваться не только в литеральной форме, но и через переменные (т. е. может использоваться косвенное именование).
<scope option> относится к области видимости имен: в пределах текущего модуля или в пределах текущей сессии.
4. 1. 12 Оператор открытия курсора, связанного с динамически подготовленным оператором выборки
Синтаксис оператора открытия курсора следующий:
<dynamic open statement> ::=
OPEN <dynamic cursor name> [<using clause>]
По сути оператор открытия курсора, связанного с динамически подготовленным оператором SQL, отличается от статического случая только возможным наличием раздела using, в котором задаются фактические параметры оператора выборки. Кроме того, имя курсора может задаваться через переменную (т. е. косвенным образом).
4. 1. 13 Оператор чтения строки по курсору, связанному с динамически подготовленным оператором выборки
Синтаксис:
<dynamic fetch statement> ::=
FETCH [[<fetch orientation>] FROM]
<dynamic cursor name> <using clause>
На самом деле оператор чтения по курсору, связанному с динамически подготовленным оператором SQL, отличается от статического случая только возможным наличием раздела using, в котором задается размещение значений текущей строки результирующей таблицы. Кроме того, имя курсора может задаваться через переменную.
4. 1. 14 Оператор закрытия курсора, связанного с динамически подготовленным оператором выборки
Оператор закрытия курсора определяется следующим синтаксическим правилом:
<dynamic close statement> ::=
CLOSE <dynamic cursor name>
Оператор закрытия курсора, связанного с динамически подготовленным оператором SQL, отличается от статического случая только тем, что имя курсора может задаваться через переменную.
4. 1. 15 Оператор позиционного удаления по курсору, связанному с динамически подготовленным оператором выборки
Синтаксис:
<dynamic delete statement: positioned> ::=
DELETE FROM <table name>
WHERE CURRENT OF <dynamic cursor name>
Оператор позиционного удаления по курсору, связанному с динамически подготовленным оператором SQL, отличается от статического случая только тем, что имя курсора может задаваться через переменную.
4. 1. 16 Оператор позиционной модификации по курсору, связанному с динамически подготовленным оператором выборки
Оператор определяется следующим синтаксическим правилом:
<dynamic update statement: positioned> ::=
UPDATE <table name>
SET <set clause> [{<comma> <set clause>}. . . ]
WHERE CURRENT OF <dynamic cursor name>
Оператор позиционной модификации по курсору, связанному с динамически подготовленным оператором SQL, отличается от статического случая только тем, что имя курсора может задаваться через переменную.
4. 1. 17 Подготавливаемый оператор позиционного удаления
Синтаксис оператора:
<preparable dynamic delete statement: positioned> ::=
DELETE [FROM <table name>]
WHERE CURRENT OF <cursor name>
Основной резон появления этого и следующего операторов состоит в том, что сочетание курсора, определенного на динамически подготовленном операторе выборки, и статически задаваемых операторах удаления и модификации по этому курсору, выглядит довольно нелепо. Поэтому в стандарте появились динамически подготавливаемые позиционные операторы удаления и вставки. Естественно, что выполняться они должны с помощью оператора EXECUTE.
4. 1. 18 Подготавливаемый оператор позиционной модификации
<preparable dynamic update statement: positioned> ::=
UPDATE [<table name>]
SET <set clause> [{<comma> <set clause>}. . . ]
WHERE CURRENT OF <cursor name>
См. п. 4. 1. 17.
Если внимательно сравнить средства динамического SQL СУБД Oracle V. 6и стандарта SQL/92, то видно, что Oracle практически вкладывается в стандарт, если не считать небольших синтаксических различий и (что существенно более важно) разного стиля работы с дескрипторами. Думается, что примерно такая же ситуация имеет место в других СУБД, поддерживающих динамический SQL.
Поэтому нашими рекомендациями при использовании динамического SQL в прикладных программах являются следующие (если, конечно, вы не хотите дождаться повсеместной и полной реализации SQL/92):