Основы SQL
Определяемые пользователем типы
Определяемые пользователем типы (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, означает "приведение"). Сравнения можно проводить, лишь выполнив конвертацию.