В следующем примере выбирается строка из таблицы 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 ,