|
Программирование >> Oracle
1396 Глава 2 0 44 45 46 47 48 49 50 51 53 54 nvl (compare2. street addr2, chr (0))) then return 1; elsif (nvl(self.street addr2,chr(0)) < nvl(compare2.street addr2,chr(0))) then return -1; end if; return 0; end; end; Type body created. Этот метод сравнивает два адреса по следующему алгоритму. 1. Если значение почтового индекса (ZIPCODE) у объекта SELF меньше, чем у объекта COMPARE2, вернуть -1, а если больше - 1. 2. Если значение города (CITY) у объекта SELF меньше, чем у объекта COMPARE2, вернуть -1, а если больше - 1. 3. Если значение первого компонента адреса (STREET ADDR1) у объекта SELF мен ше, чем у объекта COMPARE2, вернуть -1, а если больше - 1. 4. Если значение второго компонента адреса (STREET ADDR2) у объекта SELF мен ше, чем у объекта COMPARE2, вернуть -1, а если больше - 1. 5. Иначе вернуть 0 (адреса совпадают). Как видите, при сравнении приходится постоянно проверять, не переданы ли значения NULL, и т.п. В результате метод получился достаточно большим и сложным. Он, несомненно, неэффективен. Задумав написать метод ORDER, попробуйте использовать вместо него метод MAP. Представленное выше сравнение лучше переписать в виде метода MAP. Учтите, что если вы уже изменили тип, добавив в него представленный выше метод ORDER, придется удалить таблицу, зависящую от этого типа, удалить сам тип и создать все заново. Методы нельзя удалять - их можно только добавлять с помощью оператора ALTER TYPE, а нам надо избавиться от существующего метода OER. Полный пример должен был бы включать операторы DROP TABLE PEOPLE, DROP TYPE ADDRESS TYPE и CREATE TYPE и лишь затем - следующий оператор lER TYPE: tkyte@TKYTE816> alter type Address Type 2 REPLACE 3 as object 4 (street addrl varchar2(2 5) , 5 street addr2 varchar2(25) , 6 city varchar2(30) , 7 state varchar2(2), 8 zip code number, 9 member function toString return varchar2, 10 шар member function mapping function return varchar2 Использование объео-реляционн1х средств 1397 11 ) 12 / Type altered. tkyte@TKYTE816> create or replace type body Address Type 2 as 10 11 12 13 14 member function toString return varchar2 is begin if (street addr2 is not NULL) then return street addrl chr(10) street addr2 chr(10) city , state returnstreet addr1 chr(10) city , state end if ; end; zip code; map member function mapping function return varchar2 is begin returnto char(nvl(zip code,0), fm00000) lpad(nvl(city, ) , 30) 25); lpad(nvl(street addrl, lpad(nvl(street addr2, end; 25 end; 26 / Type body created. Возвращая строку фиксированной длины, содержащую значение ZIP CODE, затем - CITY и поля STREET ADDR, можно переложить задачу сравнений и сортировки на сервер Oracle. Прежде чем переходить к другим вариантам использования объектных типов (я больше всего люблю использовать их для расширения возможностей языка PL/SQL), хочу представить еще один тип наборов - VARRAY. В главе 6 мы рассматривали вложенные таблицы и их реализацию. Б1ло показано, что они реализуются в виде пары родительской и дочерней таблиц, со скрытым суррогатным ключом в родительской таблице и столбцом NESTED TABLE ID в порожденной. Массив VARRAY во многом похож на вложенную таблицу, но реализуется абсолютно иначе. Массив VARRAY (или вложенная таблица) используется для хранения массива данных, связанных с одной строкой. Например, если необходимо хранить в таблице PEOPLE дополнительные таблицы (скажем, массив прежних адресов проживания, начиная с самого старого), можно сделать следующее: tkyte@TKYTE816> create or replace type Address Array Type 2 as varray(25) of Address Type 1398 Глава 20 Type created. tkyte@TKYTE816> alter table people add previous addresses Address Array Type 2 / Table altered. tkyte@TKYTE816> set describe depth all tkyte@TKYTE816> desc people Name Null? Type NAME HOME ADDRESS STREET ADDR1 STREET ADDR2 CITY STATE ZIP CODE METHOD VARCHAR2(10) ADDRESS TYPE VARCHAR2(25) VARCHAR2(25) VARCHAR2(30) VARCHAR2(2) NUMBER MEMBER FUNCTION TOSTRING RETURNS VARCHAR2 METHOD MAP MEMBER FUNCTION MAPPING FUNCTION RETURNS VARCHAR2 WORK ADDRESS ADDRESS TYPE STREET ADDR1 VARCHAR2(25) STREET ADDR2 VARCHAR2(25) CITY VARCHAR2(30) STATE VARCHAR2(2) ZIP CODE NUMBER METHOD MEMBER FUNCTION TOSTRING RETURNS VARCHAR2 METHOD MAP MEMBER FUNCTION MAPPING FUNCTION RETURNS VARCHAR2 EREVIOUS ADDRESSES ADDRESS ARRAY TYPE STREET ADDR1 VARCHAR2(25) STREET ADDR2 VARCHAR2(25) CITY VARCHAR2(30) STATE VARCHAR2(2) ZIP CODE NUMBER METHOD MEMBER FUNCTION TOSTRING RETURNS VARCHAR2 METHOD MAP MEMBER FUNCTION MAPPING FUNCTION RETURNS VARCHAR2
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |