|
Программирование >> Хронологические базы данных
Отметим, что обращение к оператору обобщения также может использоваться внутри значения параметра <скалярное выражениё>, поскольку такой оператор всегда возвращает скалярное значение. Более того, результат вычисления выражения, заданного параметром <табличное выражение> и заключенного в круглые скобки, также может считаться скалярным значением, поскольку в результате вычисления получается таблица ровно с одной строкой и одним столбцом. Теперь рассмотрим операторы CASE и CAST. Оператор CASE Оператор CASE возвращают одно значение из указанного множества значений в зависимости от заданного условия, как, например, показано ниже, CASE
Оператор 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 (см. приложение А).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |