Основи на съвременните бази данни Предговор


Лекция 16. Използование SQL при приложном програмировании



страница12/17
Дата17.08.2018
Размер1.71 Mb.
#80209
1   ...   9   10   11   12   13   14   15   16   17

Лекция 16. Използование SQL при приложном програмировании

16.1. Език модулей или встроенный SQL?


В стандарте SQL/89 определены два способа взаимодействия с БД из приложной програмы, написанной на традиционном езике програмирования (как мы уже упоминали, SQL/89 ориентирован на използование совместно с езиками Кобол, Фортран, Паскаль и ПЛ/1, но в реализациях обикновено поддържася и език Си). Первый способ състои в том, что все операторы SQL, с которыми может работать данная приложная програма, собраны в один модуль и оформлены как процедуры этого модуля. За этого SQL/89 съдържит специалний подъезик - език модулей. При използовании такого способа взаимодействия с БД приложная програма съдържит извикванеы процедур модуля SQL с передачей им фактических параметров и получением ответных параметров.

Второй способ състои в използовании так называемого встроенного SQL, когато с използованием специального синтаксиса в програму на традиционном езике програмирования встраиваются операторы SQL. В этом случае с гледна точка приложной програмы оператор SQL изпълнявася "по месту". Явная параметризация операторов SQL отсутствует, но во встроенных операторах SQL могут използоваться имена переменных основной програмы, и за счет этого обеспечивается связь между приложной програмой и СУБД.

Концептуально эти два способа эквивалентны. Более того, в стандарте устанавливаются правила порождения неявного модуля SQL по програме со встроенным SQL. Однако в большинстве реализаций операторы SQL, съдържащиеся в модуле SQL, и встроенные операторы SQL обрабатываются съществено по-разному. Модуль SQL обикновено компилируется отдельно от приложной програмы, в резултате чего порождается набор так называемых хранимых процедур (в стандарте этот термин не използуется, но разпространен в коммерческих реализациях). Т.е. в случае използования модуля SQL компилация операторов SQL се извършва один раз, и затем соответствующие процедуры сколько угодно раз могут вызываться из приложной програмы.

В отличие от этого, за операторов SQL, встроенных в приложную програму, компилация этих операторов обикновено се извършва всеки раз при их използовании (правильнее сказать, при каждом первом използовании оператора при данном запуске приложной програмы).

Конечно, потребители не обязаны знать об этом техническом различии в обработке двух видов взаимодействия с СУБД. Съществуват и такие системы, които производят одноразовую компилацию встроенных операторов SQL и сохраняют откомпилированный код. Но все-таки лучше иметь это в виду.

Приведем некоито соображения за и против каждого из этих двух способов. При използовании езика модулей текст приложной програмы имеет меньший размер, взаимодействия с СУБД более локализованы за счет наличия явных параметров извикванеа процедур. С другой стороны, за понимания смысла поведения приложной програмы потребуется одновременное чтение двух текстов. Кроме того, как кажется, синтаксис модуля SQL может съществено различаться в разных реализациях. Встроенный SQL предоставляет възможность производства более "самосъдържащихся" приложных програм. Имеется больше оснований рассчитывать на простоту переноса такой програмы в среду другой СУБД, поскольку стандарт встраивания более или менее соблюдается. Основным недостатком является някоиый PL-подобный вид таких програм, независимо от выбранного основного езика. И конечно, нужно учитывать замечания, съдържащиеся в предыдущих абзацах.

Далее мы коротко опишем език модулей и правила встраивания в соответствии со стандартом SQL/89 (еще раз заметим, что формально правила встраивания не являются частью стандарта).

16.2. Език модулей


Структура модуля SQL в стандарте SQL/89 определяется следующими синтактическими правилами:

::=



[...]
< procedure > ...
::= MODULE []
::= LANGUAGE { COBOL | FORTRAN | PASCAL | PLI }
::=
AUTHORIZATION
::=

Съществено, что всеки модуль SQL ориентирован на използование в програмах, написанных на конкретном езике програмирования. Ако в модуле присутствуют процедуры работы с курсорами, то все курсоры должны быть специфицированы в начале модуля. Заметим, что объявление курсора не погружается в какую-либо процедуру, поскольку это описательный, а не выполняемый оператор SQL.


16.2.1. Определение процедуры

Процедуры в модуле SQL определяются следующими синтактическими конструкциями:

::=
PROCEDURE


...;
;

::=


|
::= SQLCODE
::=

|
|
|
|
|
|
|
|
WHERE CURRENT OF

Ако указанный в операторе курсор открыт и установлен на някоиую строку, и курсор определяет изменяемую таблицу, то текущая строка курсора удаляется, а он позиционируется перед следующей строкой. Таблица, указанная в разделе FROM оператора DELETE, должна быть таблицей, указанной в самом внешнем разделе FROM спецификации курсора.



Оператор позиционной модификации

Оператор описывается следующими синтактическими правилами:



::=
UPDATE

SET
[{,}...]
WHERE CURRENT OF
::=
=
{ | NULL }
::=

Ако указанный в операторе курсор открыт и установлен на някоиую строку, и курсор определяет изменяемую таблицу, то текущая строка курсора модифицируется в соответствии с разделом SET. Позиция курсора не изменяется. Таблица, указанная в разделе FROM оператора DELETE, должна быть таблицей, указанной в самом внешнем разделе FROM спецификации курсора.



Оператор закрытия курсора

Синтаксис этого оператора следующий:



::= CLOSE

Ако к моменту изпълнения этого оператора курсор находился в открытом состоянии, то оператор переводит курсор в закрытое состояние. После этого над курсором възможно изпълнение только оператора OPEN.


16.4.2. Одиночные операторы манипулирания данными

Всеки из операторов этой группы является абсолютно независимым от какого бы то ни было другого оператора.

Оператор выборки

За удобства мы повторяем синтаксис этого оператора еще раз:




INTO


WHERE []

Таблица T, указанная в разделе FROM оператора DELETE, должна быть изменяемой. На условие поиска накладывается то условие, что на таблицу T не должны съдържаться ссылки ни в каком вложенном подзапросе предикатов раздела WHERE.

Фактически оператор изпълнявася следующим образом: последовательно просматриваются все строки таблицы T, и те строки, за които резултатом вычисления условия выборки является true, удаляются из таблицы T. При отсутствии раздела WHERE удаляются все строки таблицы T.

Оператор поисковой модификации

Оператор обладает следующим синтаксисом:



::=
UPDATE

SET
[{,}...]
[WHERE ]
::=
=
{ | NULL }
::=

Таблица T, указанная в операторе UPDATE, должна быть изменяемой. На условие поиска накладывается то условие, что на таблицу T не должны съдържаться ссылки ни в каком вложенном подзапросе предикатов раздела WHERE.

Оператор фактически изпълнявася следующим образом: таблица T последовательно просматривается, и каждая строка, за которой резултатом вычисления условия поиска является true, изменяется в соответствии с разделом SET. Ако аритметиченое выражение в разделе SET съдържит ссылки на столбцы таблицы T, то при вычислении аритметиченого выражения използуются значения столбцов текущей строки до их модификации.

Операторы окончания транзакции

Текущая транзакция може да бъде завершена успешно (с фиксацией в базе от данни произведенных изменений) путем изпълнения оператора COMMIT WORK или аварийно (с удалением из базы от данни изменений, произведенных текущей транзакцией) путем изпълнения оператора ROLLBACK WORK. При изпълнении любого из этих операторов се извършва принудительное закрытие всех курсоров, отворених к моменту изпълнения оператора завершения транзакции.


16.5. Динамический SQL в Oracle V.6


Описанный в стандарте SQL/89 набор операторов SQL предназначен за встраивания в програму на обикновеном езике програмирования. Поэтому в этом наборе перемешаны операторы "истинного" релационного езика заявките (например, оператор удаления из таблицы части строк, удовлетворяющих заданному значению) и операторы работы с курсорами, позволяющими обеспечить построчный достъп к таблице-резултату запроса.

Понятно, что в диалоговом режиме набор операторов SQL и их синтаксис должен быть няколко другим. Весь вопрос състои в том, как реализовывать такую диалоговую програму. Правила встраивания стандартного SQL в програму на обикновеном езике програмирования предусматривают, что вся информация, касающаяся операторов SQL, известна в статике (за исключением значений переменных, използуемых в качестве констант в операторах SQL). Не предусмотрены стандартные средства компилации с последующим изпълнением операторов, които становятся известными только во время изпълнения (например, вводятся с терминала). Поэтому, опираясь только на стандарт, невъзможно реализовать диалоговый монитор взаимодействия с БД на езике SQL или другую приложную програму, в которой текст операторов SQL въниква во время изпълнения, т.е. фактически так или иначе стандарт необходимо расширять.

Один из възможных путей расширения състои в използовании специальной группы операторов, обеспечивающих динамическую компилацию (во время изпълнения приложной програмы) базового подмножества операторов SQL и поддерживающих их коректное изпълнение. Някоиый набор таких операторов входил в диалект SQL, реализованный в System R, няколко отличный набор входит в реализацию Oracle V.6 и наконец, в новом стандарте SQL/92 появилась стандартная версия динамического SQL.

Поскольку в СУБД Oracle средства динамического SQL реализованы уже сравнительно давно, имеет смысл рассмотреть сначала их, чтобы иметь основу за сравнения с SQL/92.

В дополнительный набор операторов, поддерживающих динамическую компилацию базовых операторов SQL, входят операторы: PREPARE, DESCRIBE и EXECUTE.

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

Оператор PREPARE имеет синтаксис:

::=
PREPARE FROM


::=

Во время изпълнения оператора PREPARE символьная строка, съдържащаяся в host-string-variable, передается компилатору SQL, который обрабатывает ее почти таким же образом, как ако бы получил в статике. Построенный при изпълнении оператора PREPARE код остается действующим до конца транзакции или до повторного изпълнения данного оператора PREPARE в пределах этой же транзакции.

В отличие от статически подставляемых в програму на обикновеном езике програмирования операторов SQL, в които связь с переменными включающей програмы се извършва по именам (т.е. в соответствии со стандартом во встроенном операторе SQL могут употребляться просто имена переменных включающей програмы), динамическая природа операторов, подготавливаемых с помощью оператора PREPARE, заставляет рассматривать эти имена как имена формальных параметров. Соответствие этих формальных параметров адресам переменных включающей програмы устанавливается позиционно во время изпълнения подготовленного оператора.

16.5.2. Оператор получения описания подготовленного оператора

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

Действие оператора DESСRIBE състои в том, что в указанную область памети приложной програмы (структура этой области фиксирована и известна потребителям) помещается информация, характеризующая ранее подготовленный оператор с заданным именем.


16.5.3. Оператор изпълнения подготовленного оператора

Оператор EXECUTE служит за изпълнения ранее подготовленного оператора SQL типа 'N' (не требующего применения курсора) или за совмещенной подготовки и изпълнения такого оператора. Синтаксис оператора EXECUTE:

::=
EXECUTE
{ [USING ]
( IMMEDIATE }

За изпълнения подготовленного оператора служит первый вариант оператора EXECUTE. В этом случае должен задавать имя, употреблявшееся ранее в операторе PREPARE. Ако в подготовленном операторе присутствуют формальные параметры, то в операторе EXECUTE должен задаваться список фактических параметров . Число и типы фактических параметров должны соответствовать числу и типам формальных параметров подготовленного оператора.

Второй вариант оператора EXECUTE предназначен в Oracle за совмещенной подготовки и изпълнения оператора SQL типа 'N'. В этом случае параметром оператора EXECUTE является строка, которая должна съдържать текст оператора SQL (эту строку разрешается также задавать литерально). Запрещается използование в этом операторе переменных включающей програмы (формальных параметров).

16.5.4. Работа с динамическими операторами SQL через курсоры

За използования таких операторов използуется расширение механизма курсоров стандарта SQL. Во-первых, при определении курсора можно указывать не только литеральную спецификацию курсора, но и имя оператора, вводимое с помощью оператора PREPARE (в этом случае оператор PREPARE должен текстуально находиться выше оператора DECLARE). Тем самым полный синтаксис оператора DECLARE становится следующим:

::=
DECLARE CURSOR
FOR { | }

Далее, поскольку за такого курсора в статике неизвестна информация о входных и выходных переменных включающей програмы, то използуется другая форма операторов OPEN и FETCH.

Полный синтаксис этих операторов становится следующим:

::=
OPEN
[USING { | DESCRIPTOR }]
::=
FETCH
{ INTO
( USING
( USING DESCRIPTOR }

Как видно, предлагается два способа задания фактических входных и выходных параметров: прямое с указанием в операторах OPEN и/или FETCH списков имен переменных включающей програмы и косвенное, когато число параметров и их адреса сообщаются через дополнительную структуру-дескриптор.

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

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


Лекция 17. Некоито черты SQL/92 и SQL-3


Мы не будем даже поверхностно описывать новые възможности езика SQL в стандарте SQL/92. Это сейчас не очень осмысленно, поскольку единственной достъпной реализацией SQL/92 является дорогостоящая версия Oracle V.7. Однако кажется полезным включить в наше ръководство сводку операторов динамического SQL с небольшими комментариями, поскольку в SQL/92 предпринята первая попытка стандартизовать эту часть езика SQL, и это описание можно използовать хотя бы в качестве эталона при сравнении различных реализаций. В конце лекции приводится краткая сводка новых възможностей, ожидаемых в новом стандарте SQL-3, работа над которым все еще продолжается.

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


::=
ALLOCATE DESCRIPTOR
[WITH MAX ]
::=
::=
(]
::= GLOBAL | LOCAL
::=

(


(

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

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

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

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


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


::=
DEALLOCATE DESCRIPTOR

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

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


17.3. Оператор получения информации из области дескриптора 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), либо информацию, съдържащуюся в одном из заполненных елементов.


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


::=
SET DESCRIPTOR

::=

( VALUE
[{ }...]
::= COUNT
::=



::=
::=
::=

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

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


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

::=
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.


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


::=
DEALLOCATE PREPARE

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

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


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


::=

|
::=
DESCRIBE INPUT
::=
DESCRIBE [OUTPUT]
::= |
::=
{ USING | INTO } [{ }...]
::=
::=
{ USING | INTO } SQL DESCRIPTOR
::=

|

::=

[]


::= [INDICATOR]

::=
[]
::= [INDICATOR]

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

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


17.8. Оператор изпълнения подготовленного оператора


::=
EXECUTE
(]
(
]
::=

::=



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

Оператор EXECUTE може да бъде применен к любому ранее подготовленному оператору SQL, кроме . Ако это оператор , то оператор EXECUTE должен съдържать раздел с ключевым словом INTO. В любом случае число фактических параметров, задаваемых через разделы using, должно соответствовать числу формальных параметров, определенных в подготовленном операторе SQL.


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


::=
EXECUTE IMMEDIATE

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

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


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


::=
DECLARE [INSENSITIVE] [SCROLL]
CURSOR FOR

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

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


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


::=
ALLOCATE [INSENSITIVE] [SCROLL]
CURSOR FOR
::=
(]

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

Курсоры, определяемые с помощью оператора ALLOCATE CURSOR, фактически создаются при изпълнении такого оператора и унищожаются при изпълнении оператора DEALLOCATE PREPARE или при завершении транзакции. В этом операторе имена курсора и подготовленного оператора SQL могут задаваться не только в литеральной форме, но и через променливи. относится к области видимости имен: в пределах текущего модуля или в пределах текущей сессии.


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


::=
OPEN []

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

По сути, оператор открытия курсора, свързанного с динамически подготовленным оператором SQL, отличается от статического случая только възможным наличием раздела using, в котором задаются фактические параметры оператора выборки. Кроме того, имя курсора может задаваться через переменную.


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


::=
FETCH [[] FROM]


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

По сути, оператор чтения по курсору, свързанному с динамически подготовленным оператором SQL, отличается от статического случая только възможным наличием раздела using, в котором задается размещение значений текущей строки результирующей таблицы. Кроме того, имя курсора может задаваться через переменную.


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


::=
CLOSE

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

По сути, оператор закрытия курсора, свързанного с динамически подготовленным оператором SQL, отличается от статического случая только тем, что имя курсора может задаваться через переменную.


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


::=
DELETE FROM

WHERE CURRENT OF

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

По сути, оператор позиционного удаления по курсору, свързанному с динамически подготовленным оператором SQL, отличается от статического случая только тем, что имя курсора может задаваться через переменную.


17.16. Оператор позиционной модификации по курсору, свързанному с динамически подготовленным оператором выборки


::=
UPDATE

SET [{ }...]
WHERE CURRENT OF

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

По сути, оператор позиционной модификации по курсору, свързанному с динамически подготовленным оператором SQL, отличается от статического случая только тем, что имя курсора может задаваться через переменную.


17.17. Подготавливаемый оператор позиционного удаления

::=
DELETE [FROM

]


WHERE CURRENT OF

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

Основной смысл появления этого и следующего операторов състои в том, что сочетание курсора, определенного на динамически подготовленном операторе выборки, и статически задаваемых операторов удаления и модификации по этому курсору, выглядит довольно нелепо. Поэтому в стандарте появились динамически подготавливаемые позиционные операторы удаления и вставки. Естественно, что выполняться они должны с помощью оператора EXECUTE.


17.18. Подготавливаемый оператор позиционной модификации

::=
UPDATE [

]


SET [{ }...]
WHERE CURRENT OF

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

Смотри предыдущий пункт.

Ако внимательно сравнивать средства динамического SQL СУБД Oracle V.6 и стандарта SQL/92, то видно, что Oracle практически вкладывается в стандарт, ако не считать небольших синтактических различий и (что съществено более важно) разного стиля работы с дескрипторами. Думается, что примерно такая же ситуация имеет место в других СУБД, поддерживающих динамический SQL.

17.19. Сводка новых възможностей 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. Поэтому трудно ожидать быстрой реализации этого стандарта после его принятия (а многие вообще сомневаются, что этот стандарт будет когато-либо реализован).



Каталог: tadmin -> upload -> storage
storage -> Литература на факта. Аналитизъм. Интерпретативни стратегии. Въпроси и задачи
storage -> Лекция №2 Същност на цифровите изображения Въпрос. Основни положения от теория на сигналите
storage -> Лекция 5 система за вторична радиолокация
storage -> Толерантност и етничност в медийния дискурс
storage -> Ethnicity and tolerance in media discourse revisited Desislava St. Cheshmedzhieva-Stoycheva abstract
storage -> Тест №1 Отбележете невярното твърдение за подчертаните думи
storage -> Лекции по Въведение в статистиката
storage -> Търсене на живот във вселената увод
storage -> Еп. Константинови четения – 2010 г някои аспекти на концептуализация на богатството в руски и турски език

Изтегляне 1.71 Mb.

Сподели с приятели:
1   ...   9   10   11   12   13   14   15   16   17




©obuch.info 2024
отнасят до администрацията

    Начална страница