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

0

Перейдем к изучению структурированных типов Ниже приведен ряд примеров.

CREATE TYPE POINT AS ( X FLOAT, Y FLOAT ) NOT FINAL ;

CREATE TYPE LINESEG AS ( BEGIN POINT, END POINT ) NOT FINAL }_

15  Кроме того, для методов, в отличие от функций и процедур, предусматривается определенное связывание во время прогона (см. главу 20).

Примечание. Термин метод и немного странный смысл, который должен быть предписан ему в контекстах, подобных рассматриваемому в данном разделе, происходят из области  объектно-ориентированных средств (см. главу 25).

(В действительности попытка выполнить второй оператор окончится  неудачей,  поскольку BEGIN и END в языке SQL являются зарезервированными словами, но автор ввел эти идентификаторы просто для удобства.) Поэтому в своей простейшей форме (т.е. если не  рассматриваются  различные  необязательные   спецификации)  оператор  создания структурированного типа имеет следующий синтаксис.

CREATE TYPE <type name> AS <representation> NOT FINAL ;

Ниже приведены дополнительные пояснения.

1.         Обязательная спецификация NOT FINAL рассматривается в главе 20.

Примечание. Предполагается, что в версии SQL:2003 вместо нее будет разрешено задавать альтернативную конструкцию FINAL.

2.         Параметр <representation> представляет по своей структуре разделенный за пятыми список определений атрибутов <at tribute defini tion commalist>, заключенный в круглые скобки; в этом списке параметр <attribute> состоит из имени атрибута <attribute name>, за которым следует имя типа < type name>. Но обратите особое внимание на то, что эти так называемые "атрибуты" не явля ются атрибутами в реляционном смысле, отчасти потому, что структурированные типы не являются реляционными типами (см. главу 6). Более того, применяемый здесь параметр представления <representation> обозначает фактическое фи зическое представление, а не просто некоторое возможное представление рас сматриваемого структурированного типа.

Примечание. Но проектировщик типа имеет возможность эффективно  скрыть этот факт (т.е. действительно скрыть, что представление является физическим) благодаря продуманному выбору и тщательному  проектированию операторов. Например, если иметь в виду приведенное  выше определение типа POINT, TO система автоматически предоставляет операторы для получения доступа к представлению точки в виде декартовых координат (см. пункты 3 и 6), но проектировщик типа может "вручную" предоставить операторы для получения доступа также и к представлению в виде полярных координат.

3.         Каждое определение атрибута вызывает автоматическое определение двух соответ ствующих операторов (по сути аналогичных "методам"), причем один из них яв ляется наблюдателем (observer) и один — модификатором (mutator), которые пре доставляют функциональные возможности, аналогичные16 операторам ТНЕ_ языка Tutorial D. Например, если переменные LS, Р и z, соответственно, относятся к ти пам LINESEG, POINT и FLOAT, то следующие операторы присваивания являются допустимыми.

16   Ради достижения максимальной точности следует отметить, что в языке SQL  модификаторы не являются в действительности модификаторами в обычном смысле этого термина (т.е. они не являются операторами обновления), но могут использоваться таким  образом, чтобы с их помощью предоставлялись обычные функциональные средства  модификаторов. Например, оператор "SET Р . Х  = Z" (который фактически не содержит явного вызова модификатора!) определен как сокращенный вариант оператора "SET P = P . X ( Z ) "  (который содержит такой вызов).

/* Действует как наблюдатель применительно к атрибуту X переменной Р

*/

SET Z = Р.Х ;

/* Действует как модификатор применительно к атрибуту X

переменной Р */

SET Р.Х = Z ;

/* Действует как наблюдатель применительно к атрибуту BEGIN

переменной LS */

SET X = LS.BEGIN.X ;

SET LS.BEGIN.X = Z ;

4.         В рассматриваемом операторе не предусмотрена какая-либо конструкция, анало гичная спецификации CONSTRAINT языка Tutorial D.

5.         Операторы сравнения, которые могут применяться к определяемым структуриро ванным типам, задаются с помощью отдельного оператора CREATE  ORDERING. Ниже приведены два примера.

CREATE ORDERING FOR POINT EQUALS ONLY BY STATE

; CREATE ORDERING FOR LINESEG EQUALS ONLY BY

STATE ;

Ключевые слова EQUALS ONLY означают, что для значений рассматриваемого типа единственными допустимыми операторами сравнения являются "=" и "/=" (или, скорее, "о", поскольку в языке SQL для обозначения операции сравнения на неравенство используется именно  такой знак операции). Ключевые слова BY STATE указывают, что два значения рассматриваемого типа являются равными, если и только если их i-e атрибуты равны при всех значениях i. Описание других возможных  спецификаций CREATE ORDERING выходит за рамки данной книги; достаточно сказать, что, например, при желании для структурированного  типа может быть также определена семантика оператора ">". Но следует отметить, что если данный структурированный тип не имеет связанного с ним "упорядочения", то со значениями этого типа не могут выполняться никакие операции сравнения, даже сравнения на равенство; вполне очевидно, что такое состояние дел имеет далеко идущие последствия.

6.      Ни один из селекторов не предоставляется автоматически, но эффект, аналогичный действию этих операторов, может быть достигнут следующим образом. Прежде всего, язык SQL автоматически предоставляет то, что именуется в нем функциямиконструкторами (constructor function), но такие функции при каждом вызове возвращают одно и то же значение, а именно то значение рассматриваемого типа, все атрибуты  которого  имеют   применимое  заданное  по  умолчанию  значение17. Например, при следующем вызове функции-конструктора

POINT   ()

17  Применяемое по умолчанию значение для определенного атрибута можно указать в составе  соответствующего определения атрибута. Если ни одно подобное значение не указано явно, то  применяемое по умолчанию значение (своего рода "значение, заданное по умолчанию для использования по умолчанию") будет пустым.

Примечание.  По  причинам,  которые  не  рассматриваются  в  этой  книге,  применяемое  по  умолчанию  значение обязательно  должно  быть  пустым,  если  типом  атрибута  является  либо  тип  строки  таблицы,  либо  определяемый пользователем тип (такой как POINT), и он обязательно должен быть задан либо с  помощью пустого значения, либо пустого  массива  (обозначенного  как  ARRAY  [  ]),  если  это   тип  массива.   Поэтому,  например,  вызов  функцииконструктора LINESEG () должен обязательно возвратить  отрезок прямой, оба компонента которого, BEGIN и END, ДОЛЖНЫ быть пустыми.

возвращается точка с заданными по умолчанию значениями у и X. Но после этого сразу же появляется возможность вызывать модификаторы X и Y (см. пункт 3) для получения любой такой точки, которая должна быть определена с помощью результатов этого вызова функции-конструктора.  Более того, существует возможность связать первоначальную операцию "конструирования" и последующую операцию "модификации" в одно выражение, как показано в следующем примере.

POINT   ()    .Х(5.0)    .Y(2.5)

Ниже приведен более сложный пример.

LINESEG () . BEGIN ( POINT ()

.X(5.0 ).Y(2. 5))  . END   ( POINT () .X(7.3).Y(0.8))

Примечание. При желании перед вызовами функции-конструктора можно ставить необязательное ключевое слово NEW без изменения их семантики, например, следующим образом.

NEW LINESEG () . BEGIN ( NEW POINT

().X (5 .0). Y( 2.5) ) . END   ( NEW POINT ().X( 7 .3). Y(0 .8))

7.      К структурированным типам применяются правила строгой типизации, за исключением, возможно, тех случаев, которые описаны в главе 6, раздел 6.6 (подраздел "").

8.          Кроме уже упомянутых операторов, в случае необходимости могут быть определе ны (а в последующем могут быть удалены) дополнительные операторы.

9.          Предусмотрена возможность удаления структурированных типов и упорядочений ORDERING. Кроме того, предусмотрена возможность "изменять" определения та ких типов с помощью оператора ALTER TYPE, например, можно добавлять новые атрибуты или удалять существующие (иными словами, изменять представление типа).

Дополнительная информация о структурированных типах SQL приведена в следующей главе (раздел 6.6), а также в главах 20 и 26.

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

По теме:

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