Определение новых базовых типов данных
IUS позволяет вводить новые базовые типы данных. При этом можно использовать как встроенные в IUS методы доступа и хранения, так и определять новые. Для начала рассмотрим способ создания новых базовых типов с использованием встроенных механизмов хранения.
Необходимость в создании новых базовых типов может возникать во многих случаях. Одним из самых простых случаев - это использование разных метрических систем для одного и того же понятия. Например, если некоторая фирма закупает детали в Америке, то их размеры будут указаны в футах, а цена в долларах. Если аналогичные детали закупаются в Германии, то их размеры указываются в метрической системе, а цена в евро.
IUS позволяет построить новый базовый тип данных, основанный на существующем типе, но обеспечивающий автоматическое преобразование к нужному значению. Сами типы вводятся следующими операторами:
CREATE DISTINCT TYPE usd AS MONEY;
CREATE DISTINCT TYPE euro AS MONEY;
Далее требуется ввести функции преобразования значений из долларов в евро и наоборот, а также описать возможность такого преобразования:
CREATE FUNCTION usd_to_euro (v usd) RETURNS euro; . . .
CREATE FUNCTION euro_to_usd (v euro) RETURNS usd; . . .
CREATE IMPLICIT CAST (usd AS euro WITH usd_to_euro);
CREATE IMPLICIT CAST (euro AS usd WITH euro_to_usd);
После этого можно сравнивать значения типов usd и euro , полученные из разных таблиц, не вызывая явно функцию преобразования. Такое решение существенно снижает возможность внесения ошибок, связанных с преобразованием значений.82
Другой причиной, по которой может возникнуть необходимость во введении нового базового типа данных – это принципиальное отсутствие такого типа. Для этого поддерживается механизм определения типов со скрытой структурой (Opague Types ). Типы со скрытой структурой являются абстрактными в строгом смысле этого слова. IUS лишен какой-либо информации о внутреннем устройстве этих типов и может манипулировать соответствующими значениями только посредством предоставленных разработчиком функций.
Чтобы определить тип со скрытой структурой, необходимо выполнить следующую последовательность действий:
описать на языке C (или другом внешнем языке) структуру определяемых объектов;
написать на языке C (или другом внешнем языке) вспомогательные функции, вызываемые сервером СУБД;
зарегистрировать определяемый тип в базе данных посредством оператора CREATE OPAQUE TYPE;
зарегистрировать вспомогательные функции посредством операторов CREATE FUNCTION и CREATE CAST;
предоставить права доступа к определяемому типу и его вспомогательным функциям посредством оператора GRANT;
написать требующиеся для приложения дополнительные функции, которые можно вызывать средствами SQL, и зарегистрировать их;
если нужно, реализовать специфические для определяемого типа вторичные методы доступа (функции для работы с индексами).