□ CREATE TABLE object_customers OF t_person;
Тип t_person содержит встроенный объект t_address; t_person был создан
при помощи следующего выражения:
□ CREATE TYPE t_person AS OBJECT (
id NUMBER,
first_name VARCHAR2(10),
last_name VARCHAR2(10),
dob DATE,
phone VARCHAR2(12),
address t_address
);
/
В следующих примерах в таблицу object_customers вставляются две
строки. Первый пример использует конструкторы для t_person и t_add ress,
а во втором примере конструктор для t_pe rson опущен:
□ INSERT INTO object_customers VALUES (
t_person(1, ‘ John’ , ‘ Brown’ , '01-FEB-1955’ , ‘ 800-555-1211’ ,
t_address(‘ 2 State Street’ , ‘ Beantown’ , ‘ MA’ , '12345')
))
;
INSERT INTO object_customers
id, first_name, last_name, dob, phone,
address
) VALUES (
2, ‘ Cynthia’ , ‘ Green’ , ‘ 05-FEB-1968’ , ‘ 800-555-1212’ ,
t_address(‘ 3 Free Street’ , ‘ Middle Town’ , ‘ CA’ , ‘ 12345’ )
Объекты базы данных 405
В следующем примере выбираются все строки из таблицы object_
customers. Атрибуты встроенного объекта-столбца address выводятся через
конструктор t_address:
П SELECT *
FROM object_customers;
ID FIRST_NAME LAST_NAME DOB PHONE
ADDRESS(STREET, CITY, STATE, ZIP)
1 John Brown 01-FEB-55 800-555-1211
T_ADDRESS(‘ 2 State S t r e e t ', ‘ Beantown’ , ‘MA’ , ‘ 12345’ )
2 Cynthia Green 05-FEB-68800-555-1212
T_ADDRESS(‘ 3 Free Street’ , ‘ MiDDle Town’ . ’ CA’ , ‘ 12345’ )
В следующем примере выбирается покупатель №1 из таблицы object_
customers. Обратите внимание на использование псевдонима таблицы ос,
с помощью которого указан атрибут id:
П SELECT * _ .
FROM object_customers ос
WHERE ос.id = 1;
ID FIRST_NAME LAST_NAME DOB PHONE
ADDRESS(STREET, CITY, STATE, ZIP)
1 John Brown 01-FEB-55 800-555-1211
T_ADDRESS(‘ 2 State Street’ , ‘ Beantown’ , ‘ MA’ , ‘ 12345’ )
В следующем примере выбирается строка на основании атрибута state
объекта-столбца state:
П SELECT *
FROM object_customers ос
WHERE ос.aDDress.state = ‘MA’;
ID FIRST_NAME LAST_NAME DOB PHONE
ADDRESS(STREET, CITY, STATE, ZIP)
1 John Brown 01-FEB-55 800-555-1211
T_ADDRESS(‘ 2 State Street’ , ‘ Beantown’ , ‘ MA’ , ‘ 12345’ )
В следующем запросе атрибуты id, first_name и last_name покупателя
№1 явно включены в выражение SELECT, наряду с атрибутами встроенного
объекта-столбца address:
□ SELECT ос. id, oc_first_name, ос.last_name,
ос.address.street, ос.address.city, ос.address.state, oc.address.zip
FROM object customers oc
WHERE oc.id = 1;
406 Глава 12
ID FIRST_NAME LAST_NAME ADDRESS.STREET ADDRESS.CITY AD ADDRE
1 John Brown 2 State S t re e t Beantown MA 12345
Объектные идентификаторы и объектные ссылки
Каждый объект в таблице объектов имеет уникальный идентификатор
объекта (OID); вы можете получить OID для объекта при помощи функции
REF(). Например, следующий запрос получает OID для покупателя
№1 в таблице object_customers:
□ SELECT REF(oc)
FROM object_customers ос
WHERE ос.id = 1;
REF(OC)
0000280209D66AB93F991647649D78D08B267EE44858C7B9989D9D40689FB4DA92820
AFFE2010003280000
Длинная строка чисел и символов представляет собой OID, который
идентифицирует расположение объекта в базе данных. Вы можете хранить
OID в объектной ссылке и позже получать доступ к объекту, на который
он ссылается. Объектная ссылка, которая аналогична указателю в
C++, указывает на объект, хранящийся в объектной таблице, с использованием
OID. Вы можете использовать объектные ссылки для моделирования
взаимосвязей между объектными таблицами, а также, как вы увидите позже,
вы можете использовать объектные ссылки в PL/SQL для доступа к
объектам.
Используйте тип REF для определения объектной ссылки. Следующее
выражение создаёт таблицу purchases, которая содержит два столбца объектных
ссылок по имени customer_ref и product_ref:
□ CREATE TABLE purchases (
id INTEGER PRIMARY KEY,
customer_ref REF t_person SCOPE IS object_customers,
product_ref REF t_product SCOPE IS object_products
);
Фраза SCOPE IS позволяет объектной ссылке указывать только на объекты
в конкретной таблице. Например, столбец customer_ref может указывать
только на объекты в таблице object_customers; аналогично, product_
ref может указывать только на объекты в таблице object_products.
Как уже говорилось ранее, у каждого объекта в объектной таблице имеется
уникальный идентификатор объекта, значение которого можно хранить
в столбце REF. Получить доступ к этому идентификатору объекта можно,
используя функцию REF(), а хранить возвращенное значение идентификатора
объекта можно в столбце типа REF. В следующем примере вставляется
строка в таблицу purchases. Обратите внимание на использование
функции REF( ) для чтения идентификаторов объектов для покупателя №1
и товара №1 из таблиц object_customers и object_products:
Объекты базы данных 407
□ INSERT INTO purchases (
id,
customer_ref,
product_ref
) VALUES (
1 ,
(SELECT REF(oc) FROM object_customers oc WHERE oc.id = 1),
(SELECT REF(op) FROM object_products op WHERE op.id = 1)
);
В этом примере показано, что покупатель № 1 купил товар № 1.