Определяемые пользователями типы
В DB2 определяемые пользователями типы данных называются
"индивидуальными типами" (distinct type"). В каждом из
индивидуальных типов используется общее представление одного из
встроенных типов (называемых "базовыми типами"), но может иметься
собственный набор допустимых операций.
Следующие операторы создают два индивидуальных типа с именами
DOLLARS и YEN, базирующихся на встроенном типе Decimal. Фраза
WITH COMPARISONS означает что можно сравнить любые два значения
типа DOLLARS и любые два значения типа YEN, однако значение типа
DOLLARS не может быть сравнено со значением типа YEN или с
обычным десятичным значением.
CREATE DISTINCT TYPE DOLLARS AS DECIMAL (10,2) WITH COMPARISONS;
CREATE DISTINCT TYPE YEN AS DECIMAL (10,2) WITH COMPARISONS;
При создании индивидуального типа DB2 генерирует функцию,
преобразующие значение индивидуального типа в значение его
базового типа и наоборот. Например, при создании типа DOLLARS
создаются функции преобразования DOLLARS(DECIMAL) со значением
типа DOLLARS и DECIMAL(DOLLARS) со значением типа DECIMAL(10,2).
Сразу после создания индивидуального типа единственными
операторами, применимыми к его значениям, являются операторы
сравнения. Например, если SALARY и BONUS - это два столбца типа
DOLLARS, то SALARY=BONUS и SALARY>BONUS являются допустимыми
предикатами, но выражения SALARY+BONUS и SALARY*BONUS не
допускаются, поскольку для типа DOLLARS не определены
арифметические операции.
Легко указать, какие из операций базового типа являются
осмысленными для созданного на его основе индивидуального типа.
Каждый встроенный оператор, такой как "+", реализуется функций с
тем же именем, что и оператор. Чтобы сделать этот оператор
применимым к индивидуальному типу, нужно просто создать функцию с
тем же именем, что и оператор, принимающую параметры и/или
возвращающую результат индивидуального типа данных. Функция,
реализующая оператор, может основываться на функции, реализующей
встроенный оператор. В следующих предложениях SQL определяются
оператор "+" для двух значений типа DOLLARS и оператор "*" для
значения целого типа и значения типа DOLLARS:
CREATE FUNCTION "+" (DOLLARS,DOLLARS)
RETURN DOLLARS
SOURCE
SYSIBM."+" (DECIMAL(),DECIMAL());
CREATE FUNCTION "*" (INTEGER,DOLLARS)
RETURN DOLLARS
SOURCE
SYSIBM."*" (INTEGER,DECIMAL());
После выполнения этих предложений выражения SALARY+BONUS и
2*SALARY будут допустимыми, но выражение SALARY*BUNUS останется
недопустимым, поскольку оператор умножения не определен для двух
значений типа DOLLARS.
Конечно, может потребоваться расширить функциональность
индивидуального типа за пределы набора операторов базового типа.
Например, можно создать тип ADDRESS, основанный на встроенном
типе VARCHAR(50). После этого можно создать определяемую
пользователями функцию TIMEZONE(ADDRESS), вычисляющую временную
зону этого адреса. Как и любая другая UDF, функция TIMEZONE может
быть написана на языках Си, Си++ и Бейзик и должна быть
зарегистрирована в соответствующей базе данных.