Некоторые черты SQL/92 и SQL-3
Оператор выделения памяти под
дескриптор
::= ALLOCATE DESCRIPTOR [WITH MAX ] ::= ::= (] ::= GLOBAL | LOCAL ::= ( (
Комментарий:
Дескриптор, это динамически выделяемая часть памяти прикладной программы, служащая для
принятия информации о результате или параметрах динамически подготовленного оператора SQL или задания параметров такого оператора. Смысл того, что для
выделения памяти используется оператор SQL, а не просто стандартная функция alloc или какая-нибудь другая функция динамического запроса памяти, состоит в
том, что прикладная программа не знает структуры дескриптора и даже его адреса. Это позволяет не привязывать SQL к особенностям какой-либо системы
программирования или ОС. Все обмены информацией между собственно прикладной программой и дескрипторами производятся также с помощью специальных операторов
SQL (GET и SET, см. ниже).
Второй вопрос: зачем вообще выделять память под дескрипторы динамически. Это нужно
потому, что в общем случае прикладная программа, использующая динамический SQL, не знает в статике число одновременно действующих динамических операторов SQL,
описание которых может потребоваться. С этим же связано то, что имя дескриптора может задаваться как литеральной строкой символов, так и через строковую
переменную включающего языка, т.е. его можно генерировать во время выполнения программы.
В операторе ALLOCATE DESCRIPTOR, помимо прочего, может указываться число описательных
элементов, на которое он рассчитан. Если, например, при выделении памяти под дескриптор в разделе WITH MAX указано целое положительное число N, а потом
дескриптор используется для описания M (M>N) элементов (например, M столбцов результата запроса), то это приводит к возникновению исключительной ситуации.
Оператор освобождения памяти
из-под дескриптора
::= DEALLOCATE DESCRIPTOR
Комментарий:
Выполнение этого оператора приводит к освобождению памяти из-под ранее выделенного
дескриптора. После этого использование имени дескриптора незаконно в любом операторе, кроме ALLOCATE DESCRIPTOR.
Оператор получения информации
из области дескриптора SQL
::= GET DESCRIPTOR ::= ( VALUE ({ }...] ::= COUNT ::= ::= ::= ::= ::= 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 ::= (
Комментарий:
Оператор GET DESCRIPTOR служит для выборки описательной информации, ранее размещенной в
дескрипторе с помощью оператора DESCRIBE. За одно выполнение оператора можно получить либо число заполненных элементов дескриптора (COUNT), либо информацию,
содержащуюся в одном из заполненных элементов.
Оператор установки дескриптора
::= SET DESCRIPTOR ::= ( VALUE [{ }...] ::= COUNT ::= ::= ::= ::=
Комментарий:
Оператор SET DESCRIPTOR служит для заполнения элементов дескриптора с целью его
использования в разделе USING. За одно выполнение оператора можно поместить значение в поле COUNT (число заполненных элементов), либо частично или
полностью сформировать один элемент дескриптора.
Оператор подготовки
::= PREPARE FROM ::= ::= | | | | ::= | | | | | | ::= ::= ::= ::= ::= ::= | ::= [scope option] ::= [] [] ::= FOR { READ ONLY | UPDATE [ OF ] } ::= | ::= SELECT [] ::= DISTINCT | ALL
Комментарий:
Оператор PREPARE вызывает компиляцию и построение плана выполнения заданного в текстовой
форме оператора SQL. После успешного выполнения оператора PREPARE с подготовленным оператором связывается указанное (литерально или косвенно) имя
этого оператора, которое потом может быть использовано в операторах DESCRIBE, EXECUTE, OPEN CURSOR, ALLOCATE CURSOR и DEALLOCATE PREPARE. Эта связь
сохраняется до явного выполнения оператора DEALLOCATE PREPARE.
Оператор отказа от
подготовленного оператора
::= DEALLOCATE PREPARE
Комментарий:
Выполнение этого оператора приводит к тому, что ранее подготовленный оператор SQL,
связанный с указанным именем оператора, ликвидируется, и, соответственно, имя оператора становится неопределенным. Если подготовленный оператор являлся
оператором выборки, и к моменту выполнения оператора DEALLOCATE существовал открытый курсор, связанный с именем подготовленного оператора, то оператор
DEALLOCATE возвращает код ошибки. Если же для подготовленного оператора выборки существовал неоткрытый курсор, образованный с помощью оператора ALLOCATE
CURSOR, то этот курсор ликвидируется. Если курсор объявлялся оператором DECLARE CURSOR, то такой курсор переходит в состояние, существовавшее до выполнения
оператора PREPARE. Если с курсором был связан подготовленный оператор (динамический DELETE или UPDATE), то для этих операторов выполняется неявный
оператор DEALLOCATE.
Оператор запроса описания
подготовленного оператора
::= | ::= DESCRIBE INPUT ::= DESCRIBE [OUTPUT] ::= | ::= { USING | INTO } [{ }...] ::= ::= { USING | INTO } SQL DESCRIPTOR ::= | ::= [] ::= [INDICATOR] ::= [] ::= [INDICATOR]
Комментарий:
При выполнении оператора DESCRIBE происходит заполнение указанного в операторе
дескриптора информацией, описывающей либо результат ранее подготовленного оператора SQL (если это оператор выборки), либо количество и типы параметров
подготовленного оператора. В здесь полагается писать USING SQL DESCRIPTOR.
Оператор выполнения
подготовленного оператора
::= EXECUTE (] (] ::= ::=
Комментарий:
Оператор EXECUTE может быть применен к любому ранее подготовленному оператору SQL, кроме
. Если это оператор , то оператор EXECUTE должен содержать раздел с ключевым словом INTO. В любом случае число фактических параметров, задаваемых через разделы using, должно соответствовать числу
формальных параметров, определенных в подготовленном операторе SQL.
Оператор подготовки с
немедленным выполнением
::= EXECUTE IMMEDIATE
Комментарий:
При выполнении оператора EXECUTE IMMEDIATE производится подготовка и немедленное
выполнение заданного в текстовой форме оператора SQL. При этом подготавливаемый оператор не должен быть оператором выборки, не должен содержать формальных
параметров и комментариев.
Оператор объявления курсора над
динамически подготовленным оператором выборки
::= DECLARE [INSENSITIVE] [SCROLL] CURSOR FOR
Комментарий:
Как определяется в новом стандарте, для всех операторов DECLARE CURSOR, курсоры
фактически создаются при начале транзакции и уничтожаются при ее завершении. Заметим, что в этом операторе и -
прямо заданные идентификаторы.
Оператор определения курсора
над динамически подготовленным оператором выборки
::= ALLOCATE [INSENSITIVE] [SCROLL] CURSOR FOR ::= (]
Комментарий:
Курсоры, определяемые с помощью оператора ALLOCATE CURSOR, фактически создаются при
выполнении такого оператора и уничтожаются при выполнении оператора DEALLOCATE PREPARE или при завершении транзакции. В этом операторе имена курсора и
подготовленного оператора SQL могут задаваться не только в литеральной форме, но и через переменные. относится к области видимости имен: в пределах текущего модуля или в пределах текущей сессии.
Оператор открытия курсора,
связанного с динамически подготовленным оператором выборки
::= OPEN []
Комментарий:
По сути, оператор открытия курсора, связанного с динамически подготовленным оператором SQL, отличается от статического случая только возможным наличием
раздела using, в котором задаются фактические параметры оператора выборки. Кроме того, имя курсора может задаваться через переменную.
Оператор чтения строки по
курсору, связанному с динамически подготовленным оператором выборки
::= FETCH [[] FROM]
Комментарий:
По сути, оператор чтения по курсору, связанному с динамически подготовленным оператором SQL, отличается от статического случая только возможным наличием
раздела using, в котором задается размещение значений текущей строки результирующей таблицы. Кроме того, имя курсора может задаваться через
переменную.
Оператор закрытия курсора,
связанного с динамически подготовленным оператором выборки
::= CLOSE
Комментарий:
По сути, оператор закрытия курсора, связанного с динамически подготовленным оператором SQL, отличается от статического случая только тем, что имя курсора
может задаваться через переменную
Оператор позиционного удаления
по курсору, связанному с динамически подготовленным оператором выборки
::= DELETE FROM WHERE CURRENT OF
Комментарий:
По сути, оператор позиционного удаления по курсору, связанному с динамически подготовленным оператором SQL, отличается от статического случая только тем,
что имя курсора может задаваться через переменную.
Оператор позиционной
модификации по курсору, связанному с динамически подготовленным оператором
выборки
::= UPDATE SET [{ }...] WHERE CURRENT OF
Комментарий:
По сути, оператор позиционной модификации по курсору, связанному с динамически
подготовленным оператором SQL, отличается от статического случая только тем, что имя курсора может задаваться через переменную.
Подготавливаемый оператор
позиционного удаления
::= DELETE [FROM ] WHERE CURRENT OF
Комментарий:
Основной смысл появления этого и следующего операторов состоит в том, что сочетание
курсора, определенного на динамически подготовленном операторе выборки, и статически задаваемых операторов удаления и модификации по этому курсору,
выглядит довольно нелепо. Поэтому в стандарте появились динамически подготавливаемые позиционные операторы удаления и вставки. Естественно, что
выполняться они должны с помощью оператора EXECUTE.
Подготавливаемый оператор
позиционной модификации
::= UPDATE [] SET [{ }...] WHERE CURRENT OF
Комментарий:
Смотри предыдущий пункт.
Если внимательно сравнивать средства динамического SQL СУБД Oracle V.6 и стандарта
SQL/92, то видно, что Oracle практически вкладывается в стандарт, если не считать небольших синтаксических различий и (что существенно более важно)
разного стиля работы с дескрипторами. Думается, что примерно такая же ситуация имеет место в других СУБД, поддерживающих динамический SQL.
Сводка новых возможностей SQL-3
В стандарте SQL/92 по сравнению со стандартом SQL/89 язык был расширен главным
образом количественно, хотя даже этих количественных расширений оказалось достаточно для того, чтобы стандарт SQL/92 не удалось полностью реализовать до
сих пор в большинстве коммерческих СУБД. Поскольку SQL/92 не удовлетворял значительной части претензий, исторически предъявляемых к языку SQL, был
сформирован новый комитет, который должен выработать стандарт языка с качественными расширениями. Язык SQL-3 пока не сформирован полностью, многие
аспекты продолжают обсуждаться. Поэтому к приводимой здесь сводке возможностей нужно относиться как к сугубо предварительной.
17.19.1. Типы
данных
Набор встроенных типов данных предполагается расширить типами BOOLEAN и ENUMERATED.
Хотя по причине поддержки неопределенных значений языку SQL свойственно применение трехзначной логики, тип BOOLEAN содержит только два возможных
значения true и false. Для представления значения unknown рекомендуется использовать NULL, что, конечно, не вполне естественно. Перечисляемый тип
ENUMERATED обладает свойствами, подобными свойствам перечисляемых типов в языках программирования.
Расширены возможности работы с неопределенными значениями. Появился новый оператор CREATE
NULL CLASS, позволяющий ввести именованный набор именованных неопределенных значений. При определении домена можно явно указать имя класса неопределенных
значений, появление которых допустимо в столбцах, связанных с этим доменом. Смысл каждого неопределенного значения интерпретируется на уровне пользователей.
Предполагается включение в язык возможности использования определенных пользователями типов
данных. Видимо, будут иметься возможности определения абстрактных типов данных с произвольно сложной внутренней структурой на основе таких традиционных
возможностей агрегирования и структуризации как LIST, ARRAY, SET, MULTISET и TUPLE, а также возможности определения объектных типов с соответствующими
методами в стиле объектно-ориентированного подхода.
Появляется возможность использования принципов наследования свойств существующей таблицы
(супертаблицы) при определении новой таблицы (подтаблицы). Подтаблица наследует от супертаблицы все определения столбцов и первичного ключа. Другая возможность
- создать таблицу, "подобную" существующей в том смысле, что в новой таблице наследуются определения некоторых столбцов существующей таблицы.
17.19.2.
Некоторые другие свойства SQL-3
Одной из проблем реализации языка SQL всегда являлась проблема распознавания "изменяемости" соединений. Как известно, если представление включает
соединение общего вида, то теоретически невозможно определить, можно ли однозначно интерпретировать операции обновления такого представления. Однако
существует несколько важных классов соединений, которые заведомо являются изменяемыми. В SQL-3 предполагается выделить эти классы с помощью специальных
синтаксических конструкций.
Наконец-то появляется возможность определения триггеров как комбинации спецификаций
события и действия. Действие определяется как SQL-процедура, в которой могут использоваться как операторы SQL, так и ряд управляющих конструкций. На самом
деле, этот механизм очень близок к тому, который реализован в Oracle V.7.
Что касается управления транзакциями, то происходит возврат к старой идее System R
о возможности установки внутри транзакции точек сохранения (savepoints). В операторе ROLLBACK можно указать идентификатор ранее установленной точки
сохранения, и тогда будет произведен откат транзакции не к ее началу, а к этой точке сохранения.
Как видно, можно ожидать наличия в SQL-3 многих интересных и полезных возможностей.
Однако даже промежуточные проекты стандарта включают почти в два раза больше страниц, чем стандарт SQL/92. Поэтому трудно ожидать быстрой реализации этого
стандарта после его принятия (а многие вообще сомневаются, что этот стандарт будет когда-либо реализован).