Стандарты языка реляционных баз данных SQL: краткий обзор - Некоторые черты SQL/92
ОГЛАВЛЕНИЕ
4. Некоторые черты SQL/92
Огромный объем стандарта SQL/92 и ограниченный объем этой статьи не позволяют нам описать этот стандарт сколько-нибудь подробно. Кроме того, как отмечалось выше, на сегодняшний день все еще отсутствует какая бы тони было полная реализация SQL/92. Тем не менее мы считаем полезным сравнительно подробно описать стандартные средства динамического SQL (это описание можно использовать хотя бы в качестве эталона при сравнении различных реализаций)и привести сводку основных отличий SQL/92 от SQL/89 (в этом мы будем следовать последнему изданию книги Дейта "Стандарт SQL ").
4. 1 Динамический SQL в стандарте SQL/92
Набор операторов динамического SQL в стандарте SQL/92 существенно шире того, который был реализован в Oracle V. 6. В основном это связано с тем, что введены операторы для работы с дескрипторами, а также появились подготавливаемые операторы позиционного удаления и позиционной модификации.
4. 1. 1 Оператор выделения памяти под дескриптор
Оператор имеет следующий синтаксис:
<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 столбцов результата запроса), то это приводит к возникновению исключительной ситуации.
4. 1. 2 Оператор освобождения памяти из-под дескриптора
Синтаксис оператора:
<deallocate descriptor statement> ::=
DEALLOCATE DESCRIPTOR <descriptor name>
Выполнение этого оператора приводит к освобождению памяти из-под ранее выделенного дескриптора. После этого использование имени дескриптора незаконно в любом операторе, кроме ALLOCATE DESCRIPTOR.
4. 1. 3 Оператор получения информации из области дескриптора 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</PRE>
| COLLATION_SCHEMA
| COLLATION_NAME
| CHARACTER_SET_CATALOG
| CHARACTER_SET_SCHEMA
| CHARACTER_SET_NAME
<simple target specification> ::=
<parameter name>
| <embedded variable name>
Оператор GET DESCRIPTOR служит для выборки описательной информации, ранее размещенной в дескрипторе с помощью оператора DESCRIBE (см. п. 4. 1. 7). За одно выполнение оператора можно получить либо число заполненных элементов дескриптора (COUNT), либо информацию, содержащуюся в одном из заполненных элементов.