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

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


случае; а оператор 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- это зарезервированные слова.



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

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