Выбрать главу

В следующем примере выбирается строка из таблицы purchases. Обратите

внимание, что столбцы customer_ref и product_ref содержат ссылки

на объекты в таблицах object_customers и object_products:

□ SELECT *

FROM purchases;

ID

CUSTOMER_REF

PRODUCT_REF

1

0000280209D66AB93F991647649D78D08B267EE44858C7B9989D9D40689FB4DA92820

AFFE2

0000220208662E2AB4256711D6A1B50010A4E7AE8A662E2AB2256711D6A1B50010A4E

7AE8A

Вы можете извлечь сами объекты, которые хранятся в объектной ссылке,

при помощи функции DEREF(), которая принимает объектную ссылку

как параметр, и возвращает сам объект. В следующем примере функция

DEREFO используется для получения покупателя №1 и товара №1 через

столбцы customer_ref и products_ref таблицы purchases:

□ SELECT DEREF(customer_ref), DEREF(products_ref)

FROM purchases;

DEREF(CUSTOMER)(ID, FIRST_NAME, LASTJIAME, DOB, PHONE,

ADDRESS(STREET, CITY,

DEREF(PRODUCT)(ID, NAME, DESCRIPTION, PRICE, DAYS_VALID)

T_PERS0N(1, ‘ John’ , ’ Brown’ , ’ 01-FEB-55’ , ‘ 800-555-1211’ ,

T_ADDRESS(‘ 2 State Street’ , ‘ Beantown’ , *MA’ , ‘ 12345’ ) )

T_PR0DUCT(1, ‘ Pasta’ , ‘ 20 oz bag of pasta’ , 3.95, 10)

Следующий запрос получает атрибуты first_name и aDDress.street покупателя,

а также атрибут name товара:

□ SELECT DEREF(customer_ref) . first_name,

DEREF(customer_ref) . aDDress.street, DEREF(product_ref) . name

FROM purchases;

408 Глава 12

DEREF(CUST DEREF(CUSTOMER_DEREF(PROD

John 2 State Street Pasta

В следующем примере выражение UPDATE изменяет столбец product_

ref, чтобы он указывал на товар № 2 :

□ UPDATE purchases SET product_ref = (

SELECT REF(op) FROM object_products op WHERE op.id = 2

) WHERE id = 1;

1 row updated.

Следующий запрос производит проверку изменения:

□ SELECT DEREF(customer_ref), DEREF(product_ref)

FROM purchases;

DEREF(CUSTOMER_REF) (ID, FIRST.NAME, LAST_NAME, DOB, PHONE,

ADDRESS(STREET, CITY,

DEREF(PRODUCT_REF)(ID, NAME, DESCRIPTION, PRICE, DAYS_VALID)

T_PERS0N(1, ‘ John’ , ‘ Brown’ , ‘ 01-FEB-55’ , ‘ 800-555-1211’ ,

T_ADDRESS(‘ 2 State Street’ , ‘ Beantown’ , ‘ MA’ , ‘ 12345’ ))

T_PR0DUCT(2, ‘ sardines’ , ‘ 12 oz box of sardines’ , 2.99, 5)

Сравнение значений объектов

Вы можете сравнить значения двух объектов в секции WHERE запроса при

помощи оператора равенства (=). Например, следующий запрос извлекает

покупателя №1 из таблицы object_customers:

П SELECT ос.id, ос.first_name, о с .last_name, ос.dob

FROM object_customers ос

WHERE VALUE(oc) =

t person(1, ‘ John’ , ‘ Brown’ , ‘ 01-FEB-1955 , 800-555-1211 ,

tlaDDressC 2 State Street’ , ‘ Beantown’ , ‘ MA’ , ‘ 12345’ )

);

ID FIRST_NAME LAST_NAME DOB

1 John Brown 01-FEB-55

Следующий запрос извлекает товар №1 из таблицы object_products:

□ SELECT op.id, op.name, op.price, op.days_valid

FROM object_products op , n nc

WHERE VALUE(op) = t_product(1, ‘ pasta’ , '20 oz bag of pasta , 3.95, 10),

ID NAME PRICE DAYS_VALID

1 pasta 3.95 10

Вы также можете использовать операторы о и IN в секции WHERE:

П SELECT о с .id, ос.first_name, ос.last_name, ос.dob

FROM object_customers ос

Объекты базы данных 409

WHERE VALUE(oc) <>

t_person(1, ‘ John’ , ‘ Brown’ , ‘ 01-FEB-1955’ , ‘ 800-555-1211’ ,

t_aDDress(‘ 2 State Street’ , ‘ Beantown’ , ‘ MA’ , ‘ 12345’ )

);

ID FIRST_NAME LAST NAME DOB

1 Cynthia Green 05-FEB-68

SELECT op.id, op.name, op.price, op.days_valid

FROM object_products op

WHERE VALUE(op) IN t_product(1, ‘ pasta’ , ‘ 20 oz bag of pasta’ , 3.95,

10);

ID NAME PRICE DAYS VALID

1 pasta 3.95 10

Если вы хотите использовать оператор типа <, >, <=, >=, LIKE или

BETWEEN, вам нужно указать функцию отображения для типа. Функция

отображения должна дернуть единичное значение одного из встроенных

типов, которое база данных сможет использовать для сравнения двух

объектов. Значение, возвращаемое функцией отображения, будет отличаться

для каждого объектного типа, и вам необходимо выяснить, какой

атрибут или сочетание атрибутов, представляет значение объекта наилучшим

образом. Например, для типа t_product, я бы возвращал атрибут

price; для типа t_person я бы возвращал объединение атрибутов last_

name и first_name.

Следующие выражения создают тип по имени t_pe rson2 который содержит

функцию отображения по имени get_string(). Обратите внимание,

что get_string() возвращает строку VARCHAR2, которая содержит объединение

атрибутов last_name и first_name:

CREATE TYPE t_person2 AS OBJECT (

id INTEGER,

first_name VARCHAR2(10),

last_name VARCHAR2(10),

dob DATE,

phone VARCHAR2(12),

aDDress t_aDDress,

-- объявление отображающей функции g et_str ing (),

-- которая возвращает строку VARCHAR2

MAP MEMBER FUNCTION get_string RETURN VARCHAR2

);

/

CREATE TYPE BODY t_person2 AS

-- определяем функцию отображения get_string()

MAP MEMBER FUNCTION get_string RETURN VARCHAR2 IS

BEGIN

-- возвращаем объединённую строку, содержащую

410 Глава 12

— атрибуты last_name и first_name

RETURN last_name || ' ' I I first_name;

END get_string;

END;

/

Как вы вскоре увидите, база данных автоматически вызовет get_st ring ( )

при сравнении объектов t_person2.

Следующие выражения создают таблицу по имени object_customers2 и

добавляют в неё строки:

□ CREATE TABLE object_customers2 OF t_person2;

INSERT INTO object_customers2 VALUES (

t person2(1, ‘ John’ , ‘ Brown’ , 01—FEB- 1955 , 800—555—1211 ,