Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СУБД Oracle / Лекции / Лек_ORAC / LCD / Объектно-ориентированные средства.doc
Скачиваний:
51
Добавлен:
16.04.2013
Размер:
105.47 Кб
Скачать

Item_id integer,

quantity INTEGER);

CREATE OR REPLACE TYPE sales.item_list AS TABLE OF

sales.item_Type;

CREATE TABLE sales.orders (

Id integer primary key,

order_date DATE,

ship_date DATE,

line_items sales.item_list)

NESTED TABLE line_items STORE AS items;

Для упрощения этого примера и для того, чтобы вы могли сосредоточиться непосредственно на рассмотрении вложенных таблиц, тип ITEM_TYPEне содержит атрибута для номера элемента ассортимента, а в таблицеORDERSотсутствует столбец с идентификаторами клиентов. В примерах, приведенных ниже, показана более полная схема, включающая объектные таблицы, для которых используются ссылки.

При вложении одной таблицы в другую Oracleсохраняет данные в одном физическом сегменте данных, но создает в словаре данных две логические таблицы. В предыдущем примере таблицаORDERSи соответствующая ей вложенная таблицаITEMSсоздаются как один сегмент, но как две различные таблицы.

Работа с вложенными таблицами требует использования специаль­ного синтаксиса DML. Например, приложение может вводить новый заказ и соответствующие пункты в новую таблицуORDERSпри помощи одного оператораINSERTс использованием конструкторов для ввода пунктов заказа во вложенную таблицу.

Insert into sales.Orders values (

1,Sysdate, null,

sales.item_List(

sales.item_Type(1, 22),

sales.item_Type(2, 100)));

Чтобы работать с отдельными строками вложенной таблицы, SQL-операторы должны всегда обращаться к основной таблице при помощи так называемого сглаженного подзапроса (flattened sub-query), который описывается специальным SQL-выражениемTHE. Специалисту в обла­сти реляционных систем это выражение может показаться несколько странным. Однако если прочитать (естественно, по-английски) SQL-операторы, содержащие сглаженные подзапросы, вслух, то причины использования выраженияTHEстановятся более понятны. К примеру, следующий оператор вводит в существующий заказ еще один пункт при помощи сглаженного подзапроса. Комментарий объясняет причины использования выраженияTHE.

-- Вставить новый пункт в указанный ("the")

-- список пунктов заказа #1

Insert into the(select line_items from sales.Orders

WHERE id = 1) VALUES (3,200);

Сглаженный подзапрос следует использовать и для считывания строк вложенной таблицы.

-- Выбрать идентификаторы и количество указанных

-- ("the") пунктов— заказа #1

SELECT item_id, quantity

FROM THE (SELECT line_items FROM sales.orders

WHERE id = 1)

ORDER BY item_id;

ITEM_ID QUANTITY

------- --------

1 22

2 100

3 200

Для удаления строки вложенной таблицы также необходимо приме­нять сглаженные подзапросы. Например, с помощью следующего оператора удаляется третий пункт заказа в таблице ORDERS.

-- удалить те ("the") пункты заказа # 1,

-- идентификатор которых равен 3

DELETE THE (SELECT line_items FROM sales.orders

WHERE id = 1) о

WHERE o.item_id = 3;

Создание объектных таблиц

Во всех предыдущих примерах было показано, как использовать объектные типы для усовершенствования процесса создания объектов реляционных баз данных, таких как таблицы и хранимые процедуры. Но объектные типы можно использовать и для создания объектных таблиц. Объектная таблица (object table) —это таблица базы данных, которая определяется с помощью только объектного типа, а не с использованием реляционных столбцов и т.д. При создании объектной таблицы ее столбцы соответствуют атрибутам применяемого для этого объектного типа.

Строки объектной таблицы являются объектами, имеющими тип этой таблицы. Каждый объект в объектной таблице имеет уникальный идентификатор объекта (OID - object identifier).Oracleавтоматически индексирует OID и гарантирует, что он уникален среди всех других. Эти идентификаторы используются вOracleдля описания взаимоотношений между различными объектными таблицами базы данных. Например, далее показано, как можно реализовать обычную схему ввода заказов с помощью объектных типов и объектных таблиц.

-- операторы, создающие объектную таблицу CUSTOMERS

CREATE OR REPLACE TYPE sales.customer_type AS OBJECT(