Пользовательские типы данных (User Defined Types, UDT) определяются пользователем по своему усмотрению для каких-то своих целей. Данная возможность впервые появилась в SQL: 1999. Одно из важнейших направлений применения заключается в устранении некоторых несоответствий между основными типами данных SQL и типами данных в базовом языке, на котором пишутся приложения. К созданию своих типов данных обычно прибегают программисты, а не рядовые пользователи баз данных, даже владеющие языком SQL. Тем не менее, им также не помешает ознакомиться в общих чертах с этой возможностью SQL.
Простейшей формой пользовательских типов являются так называемые отдельные (различающиеся) типы. Они создаются на основе ранее определенных типов, например, основных типов SQL. Синтаксис создания отдельного типа данных такой:
CREATE DISTINCT TYPE имяТипа AS определенныйТип;
Определим в качестве примера тип MONEY для хранения денежных сумм. С этой целью можно воспользоваться уже определенным числовым типом DECIMAL:
CREATE DISTINCT TYPE MONEY AS DECIMAL (9,2);
Все отдельные типы, даже созданные на базе одного и того же типа, не могут сравниваться ни друг с другом, ни с базовым типом. Таким образом, данные типа MONEY нельзя сравнивать с данными типа DECIMAL, а также с данными других числовых и нечисловых типов. Создав специальный тип для денег, мы тем самым исключили возможность сравнивать денежные суммы с количеством других вещей. По аналогии с типом MONEY можно создать типы данных для различных валют, чтобы исключить возможность сравнения их просто как обычных чисел:
CREATE DISTINCT TYPE EURO AS DECIMAL (9,2);
CREATE DISTINCT TYPE USD AS DECIMAL (9,2);
CREATE DISTINCT TYPE RU AS DECIMAL (9,2);
Чтобы сравнить денежные суммы в различных валютах, придется сначала выполнить конвертацию одной валюты в другую. В SQL это можно сделать спомощью функции приведения типов CAST ().
Допустим, имеется таблица Прайс_лист (Товар, Цена_USD, Цена_RU), в которой столбцы Цена_USD и Цена_RU определены как столбцы типов USD и RU соответственно. Эти столбцы содержат цены товаров в американских долларах и рублях. Предположим, что курс доллара к рублю изменился, и мы хотим изменить цены в рублях. Если бы Столбцы Цена_USD и Цена_RU были одногои того же типа, то данную операцию можно было бы выполнить с помощью следующего SQL-выражения:
UPDATE Прайс_лист SET Цена_RU = k * Цена_USD;
Здесь k — коэффициент конвертации.
Но поскольку столбцы Цена_USD и Цена_RU имеют различные типы, то необходимо выполнить такое выражение:
UPDATE Прайс_дист
SET CAST(Цена_RU AS DECIMAL (9,2) = k * CAST(Цена_USD AS DECIMAL (9,2));