Главная » SQL, Базы данных » Генераторы типов

0

В языке SQL поддерживаются три генератора типов18 (в терминологии SQL они называются конструкторами типов): REF, ROW и ARRAY. В данной главе рассматриваются только ROW и ARRAY, а описание REF откладывается до главы 26. Ниже приведен пример, иллюстрирующий использование генератора типа строки ROW.

CREATE TABLE CUST

( CUST# CHAR(3),

ADDR ROW ( STREET CHAR(50), CITY CHAR(25)

, STATE CHAR(2), ZIP CHAR(5) )   PRIMARY KEY ( CUST# ) ) ;

18  Существует вероятность того, что в версии SQL:2003 будет введен еще один генератор типа MULTISET.

Здесь STREET, CITY, STATE и ZIP— поля сгенерированного строкового типа. В общем, такие поля могут иметь любой тип, включая другие строковые типы. В ссылках на уровни поля используется способ уточнения с помощью точки, как в следующем примере (в нем применяется синтаксис <ехр>.< field name>, где  выражение <ехр> должно иметь значение строкового типа).

SELECT   CX.CUST#   FROM CUST   AS   CX    WHERE CX.ADDR.STATE = ‘СA’ ;

Примечание. Здесь CX — имя корреляции. Имена корреляций подробно рассматриваются в главе 8 (раздел 8.6), а пока просто отметим, что язык SQL требует использования явных имен корреляций в ссылках на имена полей для того, чтобы можно было избежать определенной синтаксической неоднозначности,  которая могла бы возникнуть в ином случае.

А ниже приведен пример оператора INSERT.

INSERT INTO CUST ( CUST#, ADDR )

VALUES ( ‘ 666 ‘ , ROW ( ‘1600 Pennsylvania Ave.’, ‘Washington’, ‘DC, ‘20500’ ) ) ;

Обратите  внимание  на  использование  в  данном  примере  "литерала   строки" (фактически он должен был бы называться "литералом строки" и  поэтому заключен в кавычки, но формально в языке SQL нет такого понятия, как литерам строки, и выражение, применяемое в данном примере, представляет собой конструктор значения строки).

Ниже приведен еще один пример.

UPDATE CUST AS CX

SET CX.ADDR.STATE = ‘TX’

WHERE CUST# = ‘999 ‘ ;

Примечание. Фактически в стандарте в настоящее время не допускается обновление на уровне поля, как в этом примере, но это упущение можно считать просто недосмотром, который обязательно должен быть устранен.

Генератор типа ARRAY является во многом аналогичным. Ниже приведен соответствующий пример.

CREATE TABLE

ITEM_SALES ( ITEM# CHAR(5),

SALES INTEGER ARRAY [12], PRIMARY KEY ( ITEM# ) ) ;

Типы, сгенерированные с помощью генератора типа ARRAY, всегда являются  одномерными; в качестве заданного типа элемента (в данном примере INTEGER) можно использовать все, что угодно, кроме еще одного типа массива19. Допустим, что а — значение некоторого типа массива. В таком случае а может содержать  любое количество п элементов (п > 0) вплоть до, но не больше указанной верхней границы (в данном примере 12). Если а содержит точно п элементов (п  > 0), то этими элементами являются именно а [1 ], а [2] , . .., а [ п ], ина них можно ссылаться именно таким образом. Выражение CARDINALITY (а) возвращает значение п.

Ниже приведены некоторые примеры, в которых используется таблица ITEM_SALES. Обратите внимание на то, что во втором примере применяется  литерал массива (или, скорее, "литерал массива", в кавычках, поскольку формально он называется конструктором значения массива).

SELECT ITEM# FROM ITEM_SALES

WHERE SALES [3] > 10 ;

INSERT INTO ITEM_SALES ( ITEM#, SALES

) VALUES ( ‘X4320′,

ARRAY t 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ) ;

UPDATE ITEM_SALES SET SALES [3] = 10 WHERE ITEM# = ‘Z0564′ ;

Завершаем этот раздел замечанием, что к типам ROW и ARRAY применимы операторы присваивания и сравнения на равенство, при условии, что операторы  присваивания и сравнения на равенство применимы к типам элементов рассматриваемого типа ROW ИЛИ ARRAY; если же последние операторы не определены, то нельзя определить и соответствующие операторы для рассматриваемого типа ROW или ARRAY.

5.5.  РЕЗЮМЕ

В данной главе приведено всестороннее описание важного понятия типов  данных (называемых также доменами или просто типами). Тип представляет собой множество значений, а именно, множество всех значений, которые соответствуют некоторому ограничению типа (определяемому в языке Tutorial  D с помощью конструкции POSSREP, включающей необязательную  спецификацию  CONSTRAINT). Каждый тип имеет связанное с ним множество операторов (к нему относятся и операторы, предназначенные только для чтения,  и  операторы обновления), позволяющие оперировать со значениями и переменными рассматриваемого типа. Типы могут быть сколь угодно простыми или

19  Существует вероятность того, что это ограничение в версии SQL:2003 будет снято. В любом случае, типом элемента может быть тип строки, а этот тип строки может включать поле некоторого типа массива. Поэтому (например) ниже приведено допустимое определение переменной.

VX  ROW   (FX   INTEGER  ARRAY   [ 1 2 ] )   ARRAY   [12]

И в таком случае (например) VX [ 3 ] . FX [ 5 ] ссылается на пятый элемент массива, который представляет собой единственное значение поля в строке, которая является третьим элементом массива, представляющим собой значение переменной VX.

сложными, поэтому могут быть предусмотрены типы, значениями которых  являются числа, строки, даты, отметки времени, звукозаписи, географические карты, видеозаписи или геометрические точки и т.д. Допустимое множество операторов зависит от типов в том смысле, что операнды любой конкретной операции обязательно должны иметь тип, определенный для этой операции (строгая типизация). Строгая типизация весьма желательна,  поскольку  она  позволяет  своевременно  выявлять  определенные  логические ошибки, которые к тому же обнаруживаются на этапе компиляции, а не на этапе прогона. Следует отметить, что применение строгой типизации влечет за собой особо важные последствия по отношению к реляционным операциям (соединение, объединение и т.д.), как будет описано в главе 7.

Кроме того, в этой главе рассматривалось важное логическое различие между значениями и переменными и было указано, что существенным свойством значения является то, что его нельзя обновлять. Значения и переменные всегда являются типизированными; таковыми являются также (реляционные) атрибуты, (предназначенные только для чтения) операторы, параметры и, вообще говоря, выражения произвольной сложности.

Типы могут быть определяемыми системой или пользователем; кроме того, они могут

быть скалярными или нескалярными. Скалярный тип не имеет компонентов,  видимых пользователю. (Наиболее важными нескалярными типами в реляционной модели являются типы отношения, которые рассматриваются в следующей главе.) Автор стремится показать важное различие между типом и его физическим представлением (типы относятся к уровню модели, а физические представления — к уровню реализации). Но требуется также, чтобы каждый тип имел по меньшей мере одно объявленное возможное представление (допустимо также наличие больше одного такого представления). Каждое подобное возможное представление  вызывает автоматическое определение одного оператора селектора, а также определение по одному оператору ТНЕ_ для каждого компонента этого возможного представления (включая псевдопеременную ТНЕ_). Автор поддерживает идею явного преобразования типов, но не поддерживает неявные способы приведения типов. Автор является также сторонником подхода, предусматривающего определение любого количества дополнительных операторов для скалярных типов, и выдвигает требование, чтобы для каждого типа был предусмотрен оператор сравнения на равенство и оператор присваивания (возможно, даже множественного).

В настоящей главе рассматривались также генераторы типов, представляющие собой операторы, которые возвращают типы (такие как ARRAY). Ограничения и  операторы, применимые к сгенерированным типам, происходят от  универсальных  ограничений и

операторов, которые связаны с применимым генератором типа.

Наконец, в этой главе были кратко описаны средства определения типов языка SQL. В языке SQL предусмотрен целый ряд встроенных типов, таких как BOOLEAN, INTEGER, DATE, TIME и т.д. (с каждым из которых, безусловно, связано определенное множество операторов), но в связи с этим типами поддерживается лишь ограниченная форма строгой типизации. Этот язык позволяет также пользователям определять свои собственные

типы, которые подразделяются на типы DISTINCT И структурированные типы; кроме того, он поддерживает некоторые генераторы типов (ARRAY и ROW, а также REF). В настоящей главе приведен анализ всех этих функциональных средств SQL с точки зрения тех идей, которые были представлены в ней выше.

Источник: Дейт К. Дж., Введение в системы баз данных, 8-е издание.: Пер. с англ. — М.: Издательский дом «Вильямс», 2005. — 1328 с.: ил. — Парал. тит. англ.

По теме:

  • Комментарии