Определяемые пользователем типы — КиберПедия 

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

Определяемые пользователем типы

2020-06-02 206
Определяемые пользователем типы 0.00 из 5.00 0 оценок
Заказать работу

Определяемые пользователем типы (user-defined types, UDT) – это еще один пример новых возможностей, пришедших в SQL: 1999 из мира объектно-ориентированного программирования. Как программист на языке SQL вы больше не ограничены теми типами данных, которые определяются в спецификации SQL:2003. У вас есть возможность определять собственные типы, используя принципы абстрактных типов данных (Abstract Data Types, ADT), таких объектно-ориентированных языков программирования, как C++.

Одним из самых важных преимуществ UDT-типов является то, что их можно использовать для устранения "нестыковок" между SQL и базовым языком приложения баз данных. Застарелой проблемой SQL является то, что его заранее определенные типы данных могут не соответствовать типам, которые используются в базовом языке. Теперь же программист баз данных может создавать в SQL такие типы данных, которые не нарушают этого соответствия. UDT-типы имеют инкапсулированные атрибуты и методы. Снаружи можно видеть определение атрибутов и результаты выполнения методов, но конкретные механизмы этого выполнения скрыты от пользователя. Доступ к атрибутам и методам можно еще больше ограничить, указав, что они являются общими (public), приватными (private) или защищенными (protected). Общие атрибуты или методы доступны всем пользователям UDT, в то время как приватные – только самому UDT. Защищенные атрибуты или методы доступны только самому UDT-типу или его подтипам. Из этого можно видеть, что в SQL UDT-тип ведет себя во многом так же, как и класс из объектно-ориентированного программного языка. Существуют две формы определяемых пользователем типов: отдельный и структурный.

Отдельные типы данных

Отдельные типы данных – это простейшие формы определяемых пользователем типов. Отдельные типы определяются той особенностью, что они выражаются как единый тип данных. Они создаются на основе одного из ранее определенных типов данных, называющихся базовыми типами. Множество отдельных типов, которые все созданы на основе одного базового типа, отличаются друг от друга, и, таким образом, непосредственно сравнивать их между собой нельзя. Например, отдельные типы можно использовать, чтобы различать валюты разных стран. Проанализируйте следующее определение типа:

CREATE DISTINCT TYPE Usdollar AS DECIMAL (9.2);

В результате на основе заранее определенного типа DECIMAL создан новый тип данных предназначенный для долларов США. Аналогичным образом можно создать другой отдельный тип для евро:

CREATE DISTINCT TYPE Euro AS DECIMAL (9.2);

Теперь можно создать таблицы USInvoice (счет-фактура в долларах США) и Eurolnvoice (счет-фактура в евро), в которых используются эти новые типы. В столбцах обеих таблиц хранятся такие реквизиты: идентификатор счета-фактуры, идентификатор клиента, идентификатор сотрудника, общая сумма продажи, сумма налога, сумма поставки и общий итог.

CREATE TABLE USInvoice (

InvID INTEGER PRIMARY KEY,
CustID INTEGER,  
EmpID INTEGER,  
TotalSale Usdollar,  
Tax Usdollar,  
Shipping Usdollar,  
GrandTotal Usdollar  

);

 

CREATE TABLE Eurolnvoice (

InvID INTEGER PRIMARY KEY,
CustID INTEGER,  
EmpID INTEGER,  
TotalSale Euro,  
Tax Euro,  
Shipping Euro,  
GrandTotal Euro  

);

Оба типа, Usdollar и Euro, созданы на основе типа DECIMAL, но величины первого типа нельзя сравнивать с величинами второго, как и с величинами типа DECIMAL. Теперь в SQL, как и в обменном пункте, можно конвертировать доллары в евро, но для этого требуется специальная операция (CAST, означает "приведение"). Сравнения можно проводить, лишь выполнив конвертацию.

Структурированные типы

Вторая форма определяемого пользователем типа – структурированный тип. Он представляет собой перечень определений атрибутов и методов, а не базируется на отдельном предопределенном исходном типе.

Конструкторы

При создании структурного 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

Сводка типов данных

В таблице 2.2 перечислены различные типы данных и показаны литералы, которые соответствуют каждому из этих типов.

Таблица 2.2. Типы данных.

Тип данных Пример значения
CHARACTER (20) 'Любительское радио'
VARCHAR (20) 'Любительское радио'
CLOB (1000000) 'В этой строке миллион символов..'
SMALLINT, BIGINT ИЛИ INTEGER 7500
NUMERIC или DECIMAL 3425.432
REAL, FLOAT ИЛИ DOUBLE PRECISION 6.626e-34
BLOB (1000000) '1001001110101011010101010101… '
BOOLEAN 'true'
DATE DATE '1957-08-14'
TIME (2) WITHOUT TIME ZONE (аргумент указывает количество цифр в дробной части) TIME '12:46:02.43' WITHOUT TIME ZONE
TIME (3) WITH TIME ZONE TIME '12:46:02.432-08:00' WITH TIME ZONE
TIMESTAMP WITHOUT TIME ZONE (0) TIMESTAMP '1957-08-14 12:46:02' WITHOUN TIME ZONE
TIMESTAMP WITH TIME ZONE (0) TIMESTAMP '1957-08-14 12:46:02-08:00' WITH TIME ZONE
INTERVAL DAY INTERVAL '4' DAY
ROW ROW (Street VARCHAR (25), City VARCHAR (20), Stat CHAR (2), PostalCode VARCHAR (9))
ARRAY INTEGER ARRAY [15]
MULTISET Нет точного применения типа multiset
REF Это не тип, а указатель
USER DEFINED TYPE Тип валюты, созданный на основе decimal

Помни:
Имеющаяся у вас реализация SQL может не поддерживать все типы данных, перечисленные в этом разделе. Более того, в вашей реализации могут поддерживаться нестандартные типы, которые здесь не описываются. (Каждый из вас успел уже как профессионал набраться опыта, "намотать километраж" и т.д. Так что вы знаете, где искать то, чего еще не знаете.)

Неопределенные значения

Помни:
Если в поле базы данных находятся какие-то данные, то в этом поле имеется определенное значение. А если поле не содержит никаких данных, то говорят, что у него неопределенное значение. Неопределенное значение (null) в числовом поле – это не одно и то же, что нуль. А в символьном поле неопределенное значение – это не одно и то же, что пустая строка. И нуль и пустая строка являются определенными значениями. Неопределенное же значение указывает на то, что имеющееся в поле значение неизвестно
.

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

· Значение существует, но вам оно пока что неизвестно. До того, как была точно вычислена масса кварка, вы в самой верхней строке таблицы QUARM (кварк) установили в поле MASS (масса) неопределенное значение.

· Значение пока что не существует. В строке SQL For Dummies, 5th Edition таблицы BOOKS (книги) вы установили в поле TOTAL_SOLD (всего продано) неопределенное значение, так как первые данные о продажах за квартал еще не поступили.

· Поле для данной строки неприменимо. В строке С-ЗРО таблицы EMPLOYEE (наемный работник) вы установили в поле SEX (пол) неопределенное значение, так как С-ЗРО – это андроид, у которого пола нет.

· Значение выходит за пределы установленного диапазона. В строке Oprah Winfrey (Опра Уинфри) таблицы EMPLOYEE вы установили в поле SALARY (зарплата) неопределенное значение, так как для этого поля вы задали тип NUMERIC (8.2), а оклад, предусмотренный в контракте Опра, превышает 999999.99 доллара.

Совет:
Поле может иметь неопределенное значение по самым разным причинам. Так чад не торопитесь с выводами относительно того, что означает конкретное неопределенное значение
.

Ограничения

Ограничения вы устанавливаете на данные, вводимые кем-либо в таблицу базы данных. Например, известно, что значения, вводимые в определенный числовой столбец, должны находиться в пределах определенного диапазона. А если кто-то вводит число, которое не попадает в этот диапазон, то такой ввод будет ошибочным. От таких ошибок и защищает установленное на столбец ограничение – вводить в него только значения из определенного диапазона.

Традиционно сложилось так, что если прикладная программа использует базу данных, то она и накладывает на эту базу любые ограничения. Однако в самых последних продуктах у вас есть возможность устанавливать ограничения на данные непосредственно из СУБД. Этот подход дает несколько преимуществ. Если одна и та же база данных используется множеством приложений, то вам придется устанавливать ограничения только один раз, а не столько, сколько имеется приложений. Кроме того, устанавливать ограничения на уровне базы данных обычно проще, чем на уровне приложения. Во многих случаях вам будет достаточно только добавить предложение в свой оператор CREATE (создать).

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


Поделиться с друзьями:

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

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



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.023 с.