Программирование >>  Oracle 

1 ... 323 324 325 [ 326 ] 327 328 329 ... 469


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



1 ... 323 324 325 [ 326 ] 327 328 329 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика