|
Программирование >> Хронологические базы данных
случае; а оператор ANY возвращает значение ложь, если каждое значение в столбце - ложь, и значение истина в противном случае. Как и для других операторов обобщения, NULL-значения перед выполнением операции исключаются. CLOB ( больщой символьный объект ). Этот тип представляет собой символьную строку переменной длины, по существу, неограниченного размера. Сопутствующий механизм локатора аналогичен (до некоторой степени) привычному механизму курсора и позволяет иметь доступ к отдельным частям таких строк. Многие операторы обычных символьных строк не поддерживают подобные строки. Среди тех, которые все-таки поддерживают, - = и LIKE. BLOB ( больщой двоичный объект ). Этот тип аналогичен предыдущему, но строки являются строками октетов , т.е., по сути, байтов, а не символов. Генерируемые типы в языке SQL3 имеются следующие генераторы типов: REF, ARRAY и ROW. Однако единственный способ определить тип REF - неявный, представляющий собой побочный эффект определения структурированного типа с помощью оператора CREATE TYPE (читайте далее этот раздел). Поэтому мы пока не будем его рассматривать. Что касается генераторов типов ARRAY и ROW, то они, по существу, вообще не могут быть определены как таковые (поскольку не существует специальных операторов CREATE ARRAY TYPE и CREATE ROW TYPE). Они могут использоваться только путем обращения к соответствующему генератору типа, подключенному , например, к оператору CREATE TABLE. Приведем пример, в котором показано, как используется тип ARRAY. CREATE TABLE SALES ( ITEM! CHAR(5), QTY INTEGER ARRAY [12], PRIMARY KEY ( ITEM! ) ) ; Здесь столбец QTY представляет значения-массивы, причем каждое значение QTY является массивом из 12 элементов, каждый из которых имеет тип INTEGER. Замечание. Массивы языка SQL ограничиваются одним измерением, и его элементы не могут быть, в свою очередь, массивами. Ниже приведен пример запроса к определенной выще таблице SALES. SELECT ITEM! FROM SALES WHERE QTY [3] > 100 ; (Смысловое значение запроса - Получить номера товаров, которые были проданы в марте в количестве, превыщающем 100 единиц .) Далее следует пример вставки строки. INSERT INTO SALES ( ITEMi, QTY ) VALUES ( X4320, ARRAY [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ) ; (Обратите внимание на использование литерала массива.) Приложение Б. Обзор языка SQL3 1043 Типы ROW аналогичны, как, например, показано ниже. CREATE TABLE CUST { CUST i CHAR(3), ADDR ROW ( STREET CHAR(50), CITY CHAR(25), STATE CHAR(2), ZIP CHAR(5) ) PRIMARY KEY ( CUSTt ) ) ; Пример запроса выглядит следующим образом. SELECT CUST* FROM CUST WHERE ADDR.STATE = CA ; Далее приведен пример вставки строки. INSERT INTO CUST ( CUSTi, ADDR ) VALUES ( 00Г, ROW ( 1600 Pennsylvania Ave., Washington, DC, 20500 ) ) ; Типы DISTINCT с помощью нового оператора CREATE TYPE создается тип, определяемый пользователем. К нему относится или тип DISTINCT, или структурированный тип (отметим, кстати, что генерируемые типы - см. предыдущий раздел - не считаются типами, определяемыми пользователями , в том же смысле). В данном подразделе будет рассматриваться только тип DISTINCT. Название типа DISTINCT, переводимое как отдельный , здесь пишется прописными буквами, чтобы подчеркнуть, что это слово используется не в его обычном смысле. Тип DISTINCT ограничивается специальным случаем типа, определяемого пользователем. В частности, его физическая реализация должна включать ровно один из встроенных скалярных типов. Ниже приводится синтаксис для определения типа DISTINCT. CREATE TYPE <имя типа> AS <имя встроенного скалярного типа> FINAL [ <режим приведения> ] [ <список спецификаций методов> ] ; Пример определения подобного пользовательского типа приведен ниже. CREATE TYPE WEIGHT AS NUMERIC (5,1) FINAL ; Пояснения 1. Тип WEIGHT наследует операторы сравнения, которые применяются к основному типу, т.е. к типу NUMERIC. Однако отметим, что значения типа WEIGHT сравнимы с другими его значениями и больше с никакими. Таким образом, если WT - SQL-переменная типа WEIGHT, следующее сравнение недопустимо. WT > 14.7 Однако, если в параметре <режш приведение указаны соответствующие опщш приведения (детали здесь не уточняются), следующие сравнения уже будут допустимыми. WT > CAST ( 14.7 AS WEIGHT ) CAST ( WT AS NUMERIC ) > 14.7 Более того, два предыдущих обращения к преобразованию CAST могут быть приведены к виду WEIGHT(14.7) hNUMERIC(WT) соответственно. Замечание. Имена функций WEIGHT и NUMERIC здесь указываются определителем типа (в параметре <режим приведение). Они не подразумеваются именем типа, который был определен, или именем их основного типа. 2. Аналогичные замечания применимы и к операции присвоения, т.е. значение типа WEIGHT может быть присвоено только результату типа WEIGHT и никакому другому. 3. Тип WEIGHT автоматически не наследует другие операторы от основного типа. Однако определение метода в параметре <спецификация метода> (ни один пример не приведен) позволяет определяющему тип пользователю определить методы (см. следующий подраздел), которые применимы к значениям и переменным типа WEIGHT. Можно, например, определить функцию ADDW, которая складывает два веса, получая третий. Поэтому пользователь может написать такие выражения. ADDW ( WT1, WT2 ) ADDW ( WT1, WEIGHT ( 14.7 ) ) 4. В определении типа должна присутствовать спецификация FINAL (см. следующий подраздел). Структурированные типы Еще один вид типа, определяемого пользователем, - структурированный тип. Ниже представлены два примера. CREATE TYPE POINT AS ( X FLOAT, Y FLOAT ) FINAL ; CREATE TYPE LINESEG AS ( BEGIN POINT, END POINT ) FINAL ; Пояснения 1. Говорят, что тип POINT имеет атрибуты X и Y (не путайте с атрибутами кортежей и отношений, которые определялись в части II этой книги). Аналогично тип LINESEG также имеет атрибуты BEGIN и END. Атрибут может относиться к любому известному типу. 2. К сожалению, атрибуты, которые указаны в определении структурированного типа, представляют физическую реализацию его значений, а не возможное представление в смысле главы 5. Поэтому, например, точки BEGIN POINT и END POINT будут физически реализованы в терминах их декартовых координат. 3. Определение каждого атрибута автоматически приводит к определению одного оператора считывания- наблюдателя (проще говоря, оператора get - получить ) и одного оператора изменения -мутатора (проще говоря, оператора На самом деле второй пример неверный, поскольку BEGIN и END- это зарезервированные слова.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |