Введение в системы БД (542480), страница 275
Текст из файла (страница 275)
Во-вторых, необходимо подчеркнуть, что последующее изложение вопросов далеко не полное. И наконец, безусловно, в порядке вещей, что некоторые детали ко времени утверждения стандарта ЯОЬЗ могут измениться, Б.2. Новые типы данных Как указывалось в предыдущем разделе, все наиболее очевидные аспекты новизны в языке 8()ЬЗ связаны с типами данных'.
Появились новые встроенные типы данных, точнее — новые встроенные скалярные типы данных, а также новые генераторы типов, которые в языке ЯЯЬЗ называются конструкторами типа. Оператор СЕНАТЕ ТХРЕ позволяет пользователям определять собственные типы (конечно, имеется и соответствующий оператор ОКОР ТХРЕ). Рассмотрим все эти возможности по порядку. Встроенные скалярнЫе типы данных В языке 8()ЬЗ поддерживаются три новых скалярных типа данных. т ВООЬЕАН. Тип ВООЬЕАН вЂ” это, конечно, тнп логических значений.
Поддерживаются обычные логические операторы (НОТ, АНО, ОК), а логические выражения могут использоваться, грубо говоря, везде, где обычно используются скалярные выражения. Однако отметим, что в языке ЯОЬ предполагается три логических значения, а не два, как уже указывалось в главе ) 8. Этим значениям соответствуют литералы ТВОЕ, РАЬВЕ н ОМКНОНН.
Тем не менее тип ВООЬЕАН включает только два значения, а не три. Неизвестное (ОНКНОНН) логическое значение представлено — совершенно неправильно! — )4()ЕЕ значениеч. Например, присвоение значения ОНКНОНН переменной типа ВООЬЕАН на самом деле приведет к установке ее значения равным НОЬЬ. Чтобы понять, насколько это серьезная ошибка, можно поразмышлять об аналоге числового типа, который для представления нуля использовал бы )ч)()ЬЬ- значение вместо числа нуль. Еще одна экстравагантность заключается в том, что в языке ВЯЬЗ (удивительно!) простая ссылка на логическую переменную не считается экземпляром того, что в приложении А называлось параметром <первичное условие>.
Таким образом, например, если переменная В относится к типу ВООЬЕАН, то предложение НЕЕКЕ В недопустимо! Наряду с типом ВООЬЕАН в языке 8()ЬЗ вводятся два новых оператора обобщения, ЕХЕКХ (Каждый) — а не АЬЬ (Все) по какой-то причине — и АНХ (Любой).
В обоих случаях аргумент представляет столбец значений типа ВООЬЕАН (почти наверняка производный столбезь как, например, в предложении ННЕКЕ АНХ(ЯТХ > 200)). Если столбец пустой, оба оператора возвращают значение неизвестно (или, правильнее, )4()ЕЕ-значение)з. Если столбец не пустой, то оператор ЕЧЕКХ возвращает значение истина, если каждое значение в столбце — истина, и значение ложь в противном ~ Все же добавим, что одним иэ наиболее неочевидных аспектов являются "домены" в стиле языка оДЕ (см.
главы 4 и 5), которые, по-видичолэу, были тихо забиты. г Сравните в этом отношении свойства условий АТЬ или АПУ (см. приложение А). 1042 Приложения случае; а оператор йМХ возвращает значение ложь, если каждое значение в столбце — ложь, и значение истина в противном случае. Как и для других операторов обобщения, )ч)(Л.1.-значения перед выполнением операции исключаются. ° СЬОВ ("большой символьный объект").
Этот тип представляет собой символьную строку переменной длины, по существу, неограниченного размера. Сопутствующий механизм локатора аналогичен (до некоторой степени) привычному механизму курсора и позволяет иметь доступ к отдельным частям таких строк. Многие операторы обычных символьных строк не поддерживают подобные строки. Среди тех, которые все-.гаки поддерживают, — "=" и ЫКЕ.
° ВЬОВ (" большой двоичный объект"). Этот тип аналогичен предыдущему, но строки являются строками "октетов", т.е., по сути, байтов, а не символов. Генерируемые типы В языке БОЬЗ имеются следующие генераторы типов: ВЕР, АВВАЧ и ВОИ. Однако единственный способ определить "тип ВЕР" — неявный представляющий собой побочный эффект определения "структурированного типа" с помощью оператора СВЕАТЕ ТХРЕ (читайте далее этот раздел). Поэтому мы пока не будем его рассматривать.
Что касается генераторов типов АННАХ и ВОИ, то они, по существу, вообще не могут быть определены как таковые (поскольку не существует специальных операторов СВЕАТЕ АРВАХ ТХРЕ и СВЕАТЕ ВОИ ТХРЕ). Они могут исиользаватьсл только путем обращения к соответствующему генератору типа, "подключенному", например, к оператору СВЕАТЕ ТАВЬЕ.
Приведем пример, в котором показано, как используется тип АННАХ. СВЕАТЕ ТАВЬЕ ЯйЬЕЯ ( 1ТЕМ4 СНАМ(5), ОТХ 1МТЕОЕВ АННАХ [12), РВ1МАВЧ КЕХ ( 1ТЕМ$ ) ) Здесь столбец ОТХ представляет значения-массивы, причем каждое значение ОТХ является массивом из 12 элементов, каждый из которых имеет тип 1МТЕОЕВ. Замечание. Массивы языка БОЬ ограничиваются одним измерением, и его элементы не могут быть, в свою очередь, массивами.
Ниже приведен пример запроса к определенной выше таблице ЯАЬЕЯ. БЕЬЕСТ 1ТЕМ4 РВОМ БАЬЕБ ИНЕВЕ ОТХ )3) > 100 1 (Смысловое значение запроса — "Получить номера товаров, которые были проданы в марте в количестве, превышающем 100 единиц'Ь) Далее следует пример вставки строки.
1МЯЕВТ 1МТО НАВЕЯ ( 1ТЕМ$, ОТХ ) ЧАЬНЕЯ ( 'Х4320', АВВАЧ ( о, о, о, о, о, о, о, о, о, о, о, о ) ) 1 (Обратите внимание на использование литерала массива.) 1043 Приложение Б. Обзор языка БДЛЗ Типы КОИ аналогичны, как, например, показано ниже. СКЕАТЕ ТАВЬЕ СПЯТ ( СПЯТ 4 СМАК(3), АРРК КОИ ( БТКЕЕТ С1ТХ ЯТАТЕ 21Р РКТНАКХ КЕУ ( СПЯТ) СНАМ(50)с СНАМ(25), СНАМ(2), СНАМ(5) ) ))' Пример запроса выглядит следующим образом. ЯЕЬЕСТ СПЯТ$ ГКОН СПЯТ ИНЕКЕ АРРК.ЯТАТЕ = 'СА' 1 Далее приведен пример вставки строки. 1МЯЕКТ 1МТО СПЯТ ( СПЯТ$, АРОК ) ЧАЬПЕЯ ( '001', КОИ ( '1600 Реллву1чалТа Аче.', 'ИаайЬл01оп', 'РС', '20500' ) ) Типы Р1ЯТ1ХСТ СКЕАТЕ ТУРЕ <ммя типа> АЯ <имя встроенного скалярного типа> Г1МА1 [ <ревмя приведения> ] ( <список спецвфлкацнй методов> ] Пример определения подобного пользовательского типа приведен ниже.
СКЕАТЕ ТУРЕ ИЕ16НТ АЯ МПНЕК1С (5,1) Г1МАЬ Пояснения 1. Тип ИЕ16НТ наследует операторы сравнения, которые применяются к основному типу, т.е. к типу МПНЕК1С. Однако отметим, что значения типа ИЕ16НТ сравнимы с другими его значениями и бокьисе с никакими. Таким образом, если ИТ вЂ” БОЬ- переменная типа ИЕ16НТ, следующее сравнение недопустимо. ИТ > 14.7 1044 Приложения С помощью нового оператора СЕНАТЕ ТУРЕ создается тип, определяемый пользователем.
К нему относится или тип Р1ЯТ1МСТ, или структурированный тип (отметим, кстати, что генерируемые типы — см. предыдущий раздел — не считаются "типами, определяемыми пользователями", в том же смысле). В данном подразделе будет рассматриваться только тип 01БТ1МСТ. Название типа РУБТ1МСТ, переводимое как "отдельный", здесь пишется прописными буквами, чтобы подчеркнуть, что это слово используется не в его обычном смысле. Тип 01ЯТ1МСТ ограничивается специальным случаем типа, определяемого пользователем. В частности, его физическая реализация должна включать ровно один из встроенных скалярных типов. Ниже приводится синтаксис для определения типа 01ЯТ1МСТ. Однако, если в параметре <реяли приведения> указаны соответствующие опции приведения (детали здесь не уточняются), следующие сравнения уже будут допустимыми.
ИТ > СйЯТ ( 14.7 АЯ ИЕ16НТ ) САЯТ ( ИТ йЯ КСМЕВ1С ) > 14.7 Более того, два предыдуших обращения к преобразованию САЯТ могут быть приведены к виду ИЕ16НТ(14.7) и КВНЕН1С(ИТ) соответственно. Замечание. Имена функций ИЕ16НТ и КВНЕВ1С здесь указываются определителем типа (в параметре <режии приведения>). Они не подразумеваются именем типа, который был определен, или именем их основного типа. 2. Аналогичные замечания применимы и к операции присвоения, т.е. значение типа ИЕ16НТ может быть присвоено только результату типа ИЕ16НТ и никакому другому. 3. Тип ИЕ16НТ автоматически не наследует другие операторы от основного типа.
Однако определение метода в параметре <спецификация негода> (ни один пример не приведен) позволяет определяющему тип пользователю определить "методы" (см. следующий подраздел), которые применимы к значениям и переменным типа ИЕ16НТ.
Можно, например, определить функцию АВВИ, которая складывает два веса, получая третий. Поэтому пользователь может написать такие выражения. АВЮИ ( ИТ1, ИТ2 ) АВВИ ( ИТ1, ИЕ16НТ ( 14.7 ) ) 4. В определении типа должна присутствовать спецификация Г1КАЬ (см. следующий подраздел). Структурированные типы Еще один вид типа, определяемого пользователем,— структурированный тип. Ниже представлены два примераз.
СНЕАТЕ ТУРЕ Р01КТ йЯ ( Х ГЬОйТ, У ГЬОАТ ) Г1КйЬ СНЕАТЕ ТУРЕ ЬЕКЕЯЕ6 АЯ ( ВЕ61К Р01КТ, ЕКВ Р01КТ ) Г1КАЬ 1 Пояснения 1. Говорят, что тип Р01КТ имеет атрибуты Х и У (не пугайте с атрибутами кортежей и отношений, которые определялись в части И этой книги). Аналогично тип ЬЕКЕЯЕ6 также имеет атрибуты ВЕ61К и ЕКВ. Атрибут может относиться к любому известному типу. 2. К сожалению, атрибуты, которые указаны в определении структурированного типа, представляют физическую реализацию его значений, а не "возможное представление" в смысле главы 5.