Основы SQL
Структурированные типы
Вторая форма определяемого пользователем типа – структурированный тип. Он представляет собой перечень определений атрибутов и методов, а не базируется на отдельном предопределенном исходном типе.
Конструкторы
При создании структурного UDT-типа СУБД автоматически создает для него функцию-конструктор, давая ей имя, аналогичное имени UDT-типа.
Мутаторы и наблюдатели
При создании структурированного UDT-типа СУБД также автоматически создает для него функцию-мутатор и функцию-наблюдатель. При применении функции-мутатора изменяется значение атрибута структурного типа. Функция-наблюдатель работает обратно функции-мутатора. Это позволяет отыскивать значение атрибута структурированного типа. Вы можете включить функции-наблюдатели в операторы SELECT, чтобы отыскать значения в базе данных.
Подтипы и супертипы
Между двумя структурированными типами могут существовать иерархические отношения. К примеру, тип MusicCDudt имеет подтипы RockCDudt и ClassicalCDudt. Для этих двух подтипов MusicCDudt является супертипом. Если для MusicCDudt нет подтипа, который является супертипом для RockCDudt, то RockCDudt является собственным подтипом MusicCDudt. Если RockCDudt имеет подтип с именем HeavyMetalCDudt, который, в свою очередь, также является подтипом для MusicCDudt, то тип HeavyMetalCDudt уже не будет являться собственным подтипом для MusicCDudt.
Структурированный тип, не имеющий супертипа, называется максимальным супертипом, а структурированный тип, не имеющий подтипа, – конечным подтипом.
Пример структурированного типа
Структурированные UDT-типы могут быть созданы следующим способом:
/* Создаем UDT-тип MusicCDudt */ | |
CREATE TYPE MusicCDudt AS | |
/* Задаем атрибуты */ | |
Title | CHAR(40), |
Cost | DECIMAL(9.2), |
SuggestedPrice | DECIMAL(9.2), |
/* Разрешаем подтипы */ | |
NOT FINAL; | |
CREATE TYPE RockCDUdt UNDER MusicCDudt NOT FINAL; |
Подтип RockCDudt наследует атрибуты своего супертипа MusicCDudt.
CREATE TYPE HeavyMetalCDudt UNDER RockCDUdt FINAL;
Создадим таблицы, использующие эти типы. Например:
CREATE TABLE METALSKU ( | |
Album | HeavyMetalCDudt, |
SKU | INTEGER); |
Теперь можно добавить строки в новую таблицу:
BEGIN /* Объявляем временную переменную 'a' */ DECLARE a = HeavyMetalCDudt; /* Выполняем функцию-конструктор */ SET a = HeavyMetalCDudt (); /* Выполняем первую функцию-мутатор */ SET a = a.title('Edward the Great'); /* Выполняем вторую функцию-мутатор */ SET a = a.cost(7.50); /* Выполняем третью функцию-мутатор */ SET a = a.suggestedprice(15/99); INSERT INTO METALSKU VALUES (a, 31415926); END