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

□ 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.