Смекни!
smekni.com

Некоторые черты SQL92 и SQL-3 (стр. 1 из 2)

Некоторые черты SQL/92 и SQL-3

Оператор выделения памяти под дескриптор

<allocate descriptor statement> ::=

ALLOCATE DESCRIPTOR <descriptor name>

[WITH MAX <occurrences>]

<occurences> ::= <simple value specification>

<descriptor name> ::=

(<scope option>] <simple value specification>

<scope option> ::= GLOBAL | LOCAL

<simple value specification> ::=

<parameter name>

(<embedded variable name>

(<literal>

Комментарий:

Дескриптор, это динамически выделяемая часть памяти прикладной программы, служащая для принятия информации о результате или параметрах динамически подготовленного оператора SQL или задания параметров такого оператора. Смысл того, что для выделения памяти используется оператор SQL, а не просто стандартная функция alloc или какая-нибудь другая функция динамического запроса памяти, состоит в том, что прикладная программа не знает структуры дескриптора и даже его адреса. Это позволяет не привязывать SQL к особенностям какой-либо системы программирования или ОС. Все обмены информацией между собственно прикладной программой и дескрипторами производятся также с помощью специальных операторов SQL (GET и SET, см. ниже).

Второй вопрос: зачем вообще выделять память под дескрипторы динамически. Это нужно потому, что в общем случае прикладная программа, использующая динамический SQL, не знает в статике число одновременно действующих динамических операторов SQL, описание которых может потребоваться. С этим же связано то, что имя дескриптора может задаваться как литеральной строкой символов, так и через строковую переменную включающего языка, т.е. его можно генерировать во время выполнения программы.

В операторе ALLOCATE DESCRIPTOR, помимо прочего, может указываться число описательных элементов, на которое он рассчитан. Если, например, при выделении памяти под дескриптор в разделе WITH MAX указано целое положительное число N, а потом дескриптор используется для описания M (M>N) элементов (например, M столбцов результата запроса), то это приводит к возникновению исключительной ситуации.

Оператор освобождения памяти из-под дескриптора

<deallocate descriptor statement> ::=

DEALLOCATE DESCRIPTOR <descriptor name>

Комментарий:

Выполнение этого оператора приводит к освобождению памяти из-под ранее выделенного дескриптора. После этого использование имени дескриптора незаконно в любом операторе, кроме ALLOCATE DESCRIPTOR.

Оператор получения информации из области дескриптора SQL

<get descriptor statement> ::=

GET DESCRIPTOR <descriptor name>

<get descriptor information>

<get descriptor information> ::=

<get count>

( VALUE <item number>

<get item information>

({<comma> <get item information>}...]

<get count> ::=

<simple target specification 1>

<equals operator> COUNT

<get item information> ::=

<simple target specification 2>

<equals operator>

<descriptor item name>

<item number> ::= <simple value specification>

<simple target specification 1> ::= <simple target specification>

<simple target specification 2> ::= <simple target specification>

<descriptor item name> ::=

TYPE

( LENGHT

( OCTET_LENGHT

( RETURNED_LENGHT

( RETURNED_OCTET_LENGHT

( PRECISION

( SCALE

( DATETIME_INTERVAL_CODE

( DATATIME_INTERVAL_PRECISION

( NULLABLE

( INDICATOR

( DATA

( NAME

( UNNAMED

( COLLATION_CATALOG

( COLLATION_SCHEMA

( COLLATION_NAME

( CHARACTER_SET_CATALOG

( CHARACTER_SET_SCHEMA

( CHARACTER_SET_NAME

<simple target specification> ::=

<parameter name>

( <embedded variable name>

Комментарий:

Оператор GET DESCRIPTOR служит для выборки описательной информации, ранее размещенной в дескрипторе с помощью оператора DESCRIBE. За одно выполнение оператора можно получить либо число заполненных элементов дескриптора (COUNT), либо информацию, содержащуюся в одном из заполненных элементов.

Оператор установки дескриптора

<set descriptor statement> ::=

SET DESCRIPTOR <descriptor name>

<set descriptor information>

<set descriptor information> ::=

<set count>

( VALUE <item number> <set item information>

[{<comma> <set item information>}...]

<set count> ::= COUNT <equals operator> <simple value specification 1>

<set item information> ::=

<descriptor item name>

<equals operator>

<simple value specification 2>

<simple target specification 1> ::= <simple target specification>

<simple target specification 2> ::=<simple target specification>

<item number> ::= <simple value specification>

Комментарий:

Оператор SET DESCRIPTOR служит для заполнения элементов дескриптора с целью его использования в разделе USING. За одно выполнение оператора можно поместить значение в поле COUNT (число заполненных элементов), либо частично или полностью сформировать один элемент дескриптора.

Оператор подготовки

<prepare statement> ::=

PREPARE <SQL statement name>

FROM <SQL statement variable>

<SQL statement variable> ::= <simple target specification>

<preparable statement> ::=

<preparable SQL data statement>

| <preparable SQL schema statement>

| <preparable SQL transaction statement>

| <preparable SQL session statement>

| <preparable implementation-defined statement>

<preparable SQL data statement> ::=

<delete statement: searched>

| <dynamic single row select statement>

| <insert statement>

| <dynamic select statement>

| <update statement: searched>

| <preparable dynamic delete statement: positioned>

| <preparable dynamic update statement: positioned>

<preparable SQL schema statement> ::= <SQL schema statement>

<preparable SQL transaction statement> ::= <SQL transaction statement>

<preparable SQL session statement> ::= <SQL session statement>

<dynamic select statement> ::= <cursor specification>

<dynamic simple row select statement> ::= <query specification>

<SQL statement name> ::= <statement name> | <extended statement name>

<extended statement name> ::= [scope option] <simple value specification>

<cursor specification> ::=

<query expression> [<order by clause>]

[<updatability clause>]

<updatability clause> ::=

FOR { READ ONLY | UPDATE [ OF <column name list> ] }

<query expression> ::=

<non-join query expression>

| <joined table>

<query specification> ::=

SELECT [<set quantifier>]

<select list> <table expression>

<set quantifier> ::= DISTINCT | ALL

Комментарий:

Оператор PREPARE вызывает компиляцию и построение плана выполнения заданного в текстовой форме оператора SQL. После успешного выполнения оператора PREPARE с подготовленным оператором связывается указанное (литерально или косвенно) имя этого оператора, которое потом может быть использовано в операторах DESCRIBE, EXECUTE, OPEN CURSOR, ALLOCATE CURSOR и DEALLOCATE PREPARE. Эта связь сохраняется до явного выполнения оператора DEALLOCATE PREPARE.

Оператор отказа от подготовленного оператора

<deallocate prepared statement> ::=

DEALLOCATE PREPARE <SQL statement name>

Комментарий:

Выполнение этого оператора приводит к тому, что ранее подготовленный оператор SQL, связанный с указанным именем оператора, ликвидируется, и, соответственно, имя оператора становится неопределенным. Если подготовленный оператор являлся оператором выборки, и к моменту выполнения оператора DEALLOCATE существовал открытый курсор, связанный с именем подготовленного оператора, то оператор DEALLOCATE возвращает код ошибки. Если же для подготовленного оператора выборки существовал неоткрытый курсор, образованный с помощью оператора ALLOCATE CURSOR, то этот курсор ликвидируется. Если курсор объявлялся оператором DECLARE CURSOR, то такой курсор переходит в состояние, существовавшее до выполнения оператора PREPARE. Если с курсором был связан подготовленный оператор (динамический DELETE или UPDATE), то для этих операторов выполняется неявный оператор DEALLOCATE.

Оператор запроса описания подготовленного оператора

<describe statement> ::=

<describe input statement>

| <describe output statement>

<describe input statement> ::=

DESCRIBE INPUT <SQL statement name> <using descriptor>

<describe output statement> ::=

DESCRIBE [OUTPUT] <SQL statement name> <using descriptor>

<using clause> ::= <using arguments> | <using descriptor>

<using arguments> ::=

{ USING | INTO } <argument> [{<comma> <argument>}...]

<argument> ::= <target specification>

<using descriptor> ::=

{ USING | INTO } SQL DESCRIPTOR <descriptor name>

<target specification> ::=

<parameter specification>

| <variable specification>

<parameter specification> ::=

<parameter name> [<indicator parameter>]

<indicator parameter> ::= [INDICATOR] <parameter name>

<variable specification> ::=

<embedded variable name> [<indicator variable>]

<indicator variable> ::= [INDICATOR] <embedded variable name>

Комментарий:

При выполнении оператора DESCRIBE происходит заполнение указанного в операторе дескриптора информацией, описывающей либо результат ранее подготовленного оператора SQL (если это оператор выборки), либо количество и типы параметров подготовленного оператора. В <using descriptor> здесь полагается писать USING SQL DESCRIPTOR.

Оператор выполнения подготовленного оператора

<execute statement> ::=

EXECUTE <SQL statement name>

(<result using clause>]

(<parameter using clause>]

<result using clause> ::= <using clause>

<parameter using clause> ::= <using clause>

Комментарий:

Оператор EXECUTE может быть применен к любому ранее подготовленному оператору SQL, кроме <dynamic select statement>. Если это оператор <dynamic single row select statement>, то оператор EXECUTE должен содержать раздел <result using class> с ключевым словом INTO. В любом случае число фактических параметров, задаваемых через разделы using, должно соответствовать числу формальных параметров, определенных в подготовленном операторе SQL.

Оператор подготовки с немедленным выполнением

<execute immediate statement> ::=

EXECUTE IMMEDIATE <SQL statement variable>

Комментарий:

При выполнении оператора EXECUTE IMMEDIATE производится подготовка и немедленное выполнение заданного в текстовой форме оператора SQL. При этом подготавливаемый оператор не должен быть оператором выборки, не должен содержать формальных параметров и комментариев.

Оператор объявления курсора над динамически подготовленным оператором выборки

<dynamic declare cursor> ::=

DECLARE <cursor name> [INSENSITIVE] [SCROLL]

CURSOR FOR <statement name>

Комментарий:

Как определяется в новом стандарте, для всех операторов DECLARE CURSOR, курсоры фактически создаются при начале транзакции и уничтожаются при ее завершении. Заметим, что в этом операторе <cursor name> и <statement name> - прямо заданные идентификаторы.

Оператор определения курсора над динамически подготовленным оператором выборки

<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> относится к области видимости имен: в пределах текущего модуля или в пределах текущей сессии.