Стандарты языка реляционных баз данных 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):

  • ограничиться подмножеством операторов динамического SQL, реализованным в Oracle V. 6;
  • локализовать части программы, связанные с работой с дескрипторами (т. е. как минимум не допускать прямой работы с полями области дескрипторов в стиле Oracle).