Программирование >>  Хронологические базы данных 

1 ... 334 335 336 [ 337 ] 338 339 340 ... 348


Отметим, что обращение к оператору обобщения также может использоваться внутри значения параметра <скалярное выражениё>, поскольку такой оператор всегда возвращает скалярное значение. Более того, результат вычисления выражения, заданного параметром <табличное выражение> и заключенного в круглые скобки, также может считаться скалярным значением, поскольку в результате вычисления получается таблица ровно с одной строкой и одним столбцом.

Теперь рассмотрим операторы CASE и CAST.

Оператор CASE

Оператор CASE возвращают одно значение из указанного множества значений в зависимости от заданного условия, как, например, показано ниже,

CASE

WHEN

S.STATUS

<

THEN

Обращаться в крайнем случае

WHEN

S.STATUS

<

THEN

Сомнительный

WHEN

S.STATUS

<

THEN

Не очень хороший

WHEN

S.STATUS

<

THEN

Посредственный

WHEN

S.STATUS

<

THEN

Приемлемый

ELSE

Отличный

Оператор CAST

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

CAST ( Р.WEIGHT AS FLOAT )

Не все пары типов данных взаимно преобразуемы. Например, не поддерживаются преобразования между числами и битовыми строками. (См. публикацию [4.22], где подробно и точно описано, какие типы данных могут быть преобразованы и в какие именно типы.)



приложение Б

Обзор языка SQL3

Б.1. Введение

Язык SQL3, возможно, будет утвержден как стандарт (SQL/99) приблизительно в то время, когда будет напечатана эта книга. Однако мы не стали ранее при его обсуждении основываться на версии SQL3 по причинам, которые указывались в главе 4, а также потому, что рассматриваем язык SQL3, мягко говоря, как какое-то недоразумение, как бы его ни защищали. С другой стороны, мы сочли необходимым включить в эту книгу обзор по крайней мере наиболее важных особенностей языка SQL3.

В языке SQL3, конечно, имеются все функциональные возможности, предусмотренные стандартом SQL/92, за исключением некоторых второстепенных (ни одна из них в книге не рассматривалась), которые были исключены сознательно. К ним относятся: ключевое слово SQLCODE, целые без знака вместо имен столбцов в предложении ORDER BY, представители идентификаторов, некоторые множества символов, определяемые пользователем, а также сопоставления, преобразования и несколько других возможностей. Но по вполне понятным причинам основное внимание здесь будет уделено тем возможностям, которые были добавлены после 1992 года, и для удобства обсуждения под языком SQL3 далее мы будем подразумевать именно эти возможности. Из них, несомненно, наиболее важными являются возможности, которые связаны с типами данных, определяемыми пользователем (мы рассмотрим их в разделах Б.2-Б.5). Самые важные из других возможностей будут представлены в разделе Б.6.

Замечание. Подробный анализ и критику по теме разделов Б.2-Б.5 можно найти в [3.3].

Прежде чем перейти к обсуждению непосредственно языка SQL3, необходимо сказать несколько слов о SQLJ [4.6]. Так неформально называют проект, в котором учитывается возможность определенной степени интеграции между языками SQL и Java (этот проект создается объединенными усилиями нескольких известных поставщиков СУБД). Часть О этого проекта связана с внедрением операторов языка SQL в программы на языке Java. В части 1 исследуется идея обращения к программам на языке Java из среды SQL (например, вызов хранимых процедур, которые написаны на языке Java). А в части 2 ре-щается задача использования классов Java как типов данных языка SQL (например, в качестве основы для определения столбцов в SQL-таблицах). Ни один из этих замыслов формально не стал частью языка SQL3 как такового, но часть О проекта SQLJ уже была опубликована в виде первого компонента новой части 10 чернового варианта стандарта языка SQL [4.22] и, по-видимому, вскоре последуют части 1 и 2 проекта SQLJ (возможно, ко времени формального опубликования описания языка SQL3).

Также вероятно, что приблизительно в то же время появится новая версия интерфейса SQL/CLI (см. главу 4).

Необходимо сделать несколько редакционных замечаний. Во-первых, в примерах книги и, в частности, этого приложения часто используется символ I в наименованиях столбцов, хотя на самом деле в языке SQL3 это не допускается. Также использу-



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

Б.2. Новые типы данных

Как указывалось в предыдущем разделе, все наиболее очевидные аспекты новизны в языке SQL3 связаны с типами данных. Появились новые встроенные типы данных, точнее - новые встроенные скалярные типы данных, а также новые генераторы типов, которые в языке SQL3 называются конструкторами типа. Оператор CREATE TYPE позволяет пользователям определять собственные типы (конечно, имеется и соответствующий оператор DROP TYPE). Рассмотрим все эти возможности по порядку.

Встроенные скалярное типы данных

в языке SQL3 поддерживаются три новых скалярных типа данных.

BOOLEAN. Тип BOOLEAN - это, конечно, тип логических значений. Поддерживаются обычные логические операторы (NOT, AND, OR), а логические выражения могут использоваться, грубо говоря, везде, где обычно используются скалярные выражения. Однако отметим, что в языке SQL предполагается три логических значения, а не два, как уже указывалось в главе 18. Этим значениям соответствуют литералы TRUE, FALSE и UNKNOWN. Тем не менее тип BOOLEAN включает только два значения, а не три. Неизвестное (UNKNOWN) логическое значение представлено - совершенно неправильно! - NULL-значением. Например, присвоение значения UNKNOWN переменной типа BOOLEAN на самом деле приведет к установке ее значения равным NULL. Чтобы понять, насколько это серьезная ошибка, можно поразмышлять об аналоге числового типа, который для представления нуля использовал бы NULL-значение вместо числа нуль.

Еще одна экстравагантность заключается в том, что в языке SQL3 (удивительно!) простая ссылка на логическую переменную не считается экземпляром того, что в приложении А называлось параметром <первичное условиё>. Таким образом, например, если переменная В относится к типу BOOLEAN, то предложение WHERE В недопустимо!

Наряду с типом BOOLEAN в языке SQL3 вводятся два новых оператора обобщения, EVERY (Каждый) - а не ALL (Все) по какой-то причине - и ANY (Любой). В обоих случаях аргумент представляет столбец значений типа BOOLEAN (почти наверняка производный столбец, как, например, в предложении WHERE ANY (QTY > 200)). Если столбец пустой, оба оператора возвращают значение неизвестно (или, правильнее, NULL-значение). Если столбец не пустой, то оператор EVERY возвращает значение истина, если каждое значение в столбце - истина, и значение ложь в противном

Все же добавим, что одним из наиболее неочевидных аспектов являются домены в стиле языка SQL (см. главы 4 и 5), которые, по-видимому, были тихо забыты.

Сравните в этом отношении свойства условий ALL или ANY (см. приложение А).



1 ... 334 335 336 [ 337 ] 338 339 340 ... 348

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика