Страница 22 из 25 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). |