|
Программирование >> Sql: полное руководство
Созданная таким образом функция может использоваться в запросах, обрабатывающих объекты АТД, как если бы она была встроенной функцией СУБД, предназначенной для работы с этим типом данных. Ниже приведено новое определение АТД addr type, используемого ДЛЯ хранеиия адреса, с относительно простой функцией-членом get full POSr {}. Эта функция получает почтовый индекс, представляющий собой запись с двумя полями (пять цифр главного почтового индекса и четыре - дополнительного), и возвращает этот же индекс в виде одного числа из девяти цифр. CREATE TYPE ADDR TYPE AS OBJECT ( STREET VARCHAR(35), CITY VARCHAR(15), STATE CHAR(2), POSTCODE POST-TYPE, MEMBER FUNCTION GET FULL POST(POSTCODE IN POST TYPE) RETURN NUMBER, PRAGMA RESTRICT REFERENCES(GET FULL POST, WNDS)); CREATE TYPE BODY ADDR TYPE AS MEMBER FUNCTION GET FULL POST(POSTCODE POST TYPE) RETURN NUMBER IS BEGIN RETURN((POSTCODE.MAIN * 10000) + POSTCODE.SFX); END; Функция-член объявляется в инструкции create type, создающей АТД, вслед за строками, описывающими элементы данных. Дополнительное предложение pragma сообщает Oracle, что функция не модифицирует содержимое базы данных; это является обязательным требованием для функций, используемых в запросах на выборку. Отдельная инструкция create type body определяет тело функции. После нескольких начальных предложений в ней следует определение функции точно такого же формата, как и в стандартных инструкциях create procedure и create function. Создав функцию-член, ее можно использовать в запросах на выборку, как в следующем примере, возвращающем список служащих, почтовый индекс которых равен 12345-6789: SELECT EMPL NUM FROM PERSONNEL WHERE GET FULL POST( ADDRESS. POSTCODE) = 123456789; Informix Universal Server не имеет специального механизма для превращения хранимых процедур в объектно-ориентированные методы. Зато допускается использование значений типа row (соответствующих объектным типам данных Oracle) в качестве параметров хранимых функций. При вызове функции ей передается запись соответствующего типа (аналогичного АТД postcode из предыдущего примера для Oracle), и функция может выполнить над ней любые необходимые действия. Например, можно создать хранимую функцию get full p0ST () с единственным параметром типа post type. После этого можно будет послать базе данных приведенный выше запрос, причем без всякой его модификации. Euje одной мощной возможностью объектно-ориентированного программирования является перегрузка методов - создание нескольких версий одного и того же метода для обработки разлотных типов данных. В иерархии классов часто требуется определить метод, который выполнял бы одинаковые или очень похожие операции над различными классами. Например, можно создать метод get tgt wages (), который будет возвращать суммарную годовую заработную плату для любого объекта класса engineers и всех его подклассов. Этот метод, реализованный в виде хранимой функции, должен возвращать годовую заработную плату любого инженера, для которого он будет вызван. Выполняемые им вычисления будут зависеть от типа ( класса ) служащего: для технолога суммарная годовая заработная плата состоит из почасовой ставки, умноженной на пятьдесят два (число недель в году) и на 40 (количество рабочих часов в неделе); для руководителя суммарная годовая заработная плата состоит из годового оклада и бонуса; для всех остальных инженеров суммарная годовая заработная плата равна их годовому окладу. Чтобы реализовать этот алгоритм, следует для каждого класса инженеров создать отдельную функцию get TGT WAGES (). Каждая функция получает в качестве параметра объект (строку таблицы technicians, engineers или managers) И возвращает вычисленную сумму. Имена всех функций идентичны, из-за чего их и называют перефуженными - одно имя на самом деле связано с несколькими хранимыми функциями. При вызове функции СУБД определяет тип переданного ей аргумента (т.е. класс объекта) и рещает, какую из реальных функций ей следует выполнить. В Informix Universal Server возможность перегрузки хранимых процедур обеспечивается без каких-либо дополнительных объектно-реляционных расширений. Эта СУБД по;5воляет создавать хранимые процедуры с одинаковыми именами при условии, что наборы их аргументов будут отличаться количеством или типами аргументов. Для примера с годовыми зарплатами можно создать следующие три функции: /* Вычисляет годовую зарплату технолога */ CREATE FUNCTION GET TGT WAGES(PERSON TECH TYPE) RETURNS MONEY(9,2) AS RETURN (PERSON.WAGE RATE * 40 * 52) END FUNCTION; /* Вычисляет годовую зарплату руководителя */ CREATE FUNCTION GET TGT WAGES(PERSON MGR TYPE) RETURNS MONEY(9,2) AS RETURN (PERSON.SALARY + PERSON.BONUS) END FUNCTION; /* Вычисляет годовую зарплату инженера */ CREATE FUNCTION GET TGT WAGES(PERSON ENGR TYPE) RETURNS MONEY(9,2) AS RETURN (PERSON.SALARY) END FUNCTION; После выполнения этих инструкций можно вызвать функцию get tgt WAGES () и передать ей строку из таблицы technicians, engineers или managers. СУБД автоматически определит, какую из трех функций ей следует выполнить, и вернет правильный результат. Технология замещения процедур в Informix Universal Server делает хранимые процедуры еще более гибким средством работы с типизированными таблицами. Если вы вызовете хранимую процедуру с аргументом типа ROW и передадите ей строку из типизированной таблицы, Informix сначала посмотрит, есть ли в базе данных хранимая процедура с указанным именем и в точности совпадающим типом аргумента. Например, если вызвать хранимую процедуру сет ЬЫ7ШЕ () для извлечения фамилии из записи типа tech type (вероятно, из таблицы technicians), Informix проверит, есть ли в базе данных процедура get lname () для обработки значения типа tech type. Если такой процедуры не окажется, СУБД Informix не станет генерировать сообщение об ошибке. Вместо этого она просмотрит иерархию типов в поиске одноименной процедуры, определенной для родительского типа. Если обнаружится процедура get lname () для типа данных engr type, Informix выполнит ее, чтобы получить требуемую информацию В противном случае поиск будет продолжен вверх по иерархии может быть, имеется функция get lname () для типа данных pers type Таким образом, замещение процедур означает, что вы можете определять хранимые процедуры для типа данных, расположенного на самом верхнем уровне иерархии, и эти процедуры будут использоваться для обработки всех его подтипов. Говоря объектно-ориентированным языком, методы класса наследуются всеми его подклассами. Резюме Похоже, что объектно-ориентированные базы данных будут играть все возрастающую роль в специализированных сегментах рынка, таких как инженерное проектирование, обработка составных документов и фафические пользовательские интерфейсы Однако пока они не получили широкого распросфанения в качестве платформы приложений для обработки деловых данных. Вместо этого на рынок вышли гибридные объектно-реляционные продукты, предлагаемые некоторыми ведущими производителями СУБД. В объектно-реляционных СУБД и SQL, и язык хранимых процедур значительно расширены новыми объектно-ориентированными инструкциями и новым синтаксисом Самыми распространенными объектно-реляционными нововведениями являются абстрактные/структурированные типы данных, таблицы в таблицах и явно поддерживаемые дескрипторы объектов Они значительно расширяют реляционную модель, но усложняют выполнение запросов к базе данных. Каждый производитель СУБД предлагает свои объектно-реляционные расширения. Между ними много концептуальных различий, а сходные возможности по-разному реализованы. Объектно-реляционные возможности особенно полезны для сложных моделей данных - они позволяют упростить общую структуру базы данных за счет усложнения отдельных таблиц или объектов Объектно-реляционные расширения являются основным содержанием стандарта SQL3, и очевидно, что в будущем они будут включены во многие реляционные СУБД.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |