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

Id integer,

last_name VARCHAR2(50),

first_name VARCHAR2(50),

company_name VARCHAR2(50),

address pub.Address_Type);

CREATE TABLE sales.customers OF sales.Customer_Type

(id PRIMARY KEY);

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

CREATE OR REPLACE TYPE sales.part_type AS OBJECT (

Id integer,

description VARCHAR2(50),

unit_price NUMBER(10,2),

on_hand INTEGER,

reorder_point INTEGER);

CREATE TABLE sales.parts OF sales.Part_Type

(id PRIMARY KEY);

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

-- вложенной таблицей ITEMS

CREATE OR REPLACE TYPE sales.item_type AS OBJECT (

Item_id integer,

part REF sales.Part_Type,

quantity INTEGER);

CREATE OR REPLACE TYPE sales.item_list

AS TABLE OF sales.item_Type;

CREATE OR REPLACE TYPE sales.order_type AS OBJECT (

Id integer,

customer REF sales.Customer_Type,

order_date DATE,

ship_date DATE,

line_items sales.item_List);

CREATE TABLE sales.orders OF sales.Order_type

(id PRIMARY KEY)

NESTED TABLE line_items STORE AS items;

Если посмотреть на описание типов ITEM_TYPEиORDER_TYPE, то можно заметить, что в приведенных примерах введено понятие объект­ной ссылки: атрибутPARTссылается на объекты типаPART_TYPE, а атрибутCUSTOMER- на объекты типаCUSTOMER_TYPE. Подобно внешнему ключу таблицы реляционной базы данных, объектная ссылка(object reference)представляет собой атрибут одного объекта, который указывает на другой объект базы данных при помощи идентификатора.

Теперь посмотрим, как работать с объектными таблицами с помощью стандартных SQL-команд DML. Сначала проанализируем операторы, демонстрирующие использование методов-конструкторов для ввода некоторых данных в таблицыPARTSиCUSTOMERS.

Insert into sales.Parts values (sales.Part_Type(1,

'Pentium 200 CPU', 250.00, 1000, 300));

Insert into sales.Customers

Values(sales.Customer_Type(1,'Ellison','Lawrence',

'Oracle Corporation',

pub.Address_Type('500 Oracle Parkway','Box 659510',

'Redwood Shores','CA','95045','USA')));

Когда в объектной таблице содержится атрибут, который является объектной ссылкой, в операторах DML, включающих этот атрибут, требуется использовать специальный синтаксис. Особенно важно, что в операторах SQLиPL/SQLдля работы с объектными ссылками необхо­димо применять функциюREF. Это функцияSQL, которая возвращает ссылку, или указатель, на идентификатор конкретного объекта. В следующем оператореINSERTпри создании списка значений для нового объекта используется подзапрос, с помощью которого также определяется идентификатор объекта клиента для нового заказа:

Insert into sales.Orders

SELECT 1, REF(c),SYSDATE, NULL, sales. item_List()

FROM sales.customers с

WHEREid= 1;

Для того чтобы заполнить список пунктов заказа, необходимо использовать операторы INSERTсо сглаженными подзапросами, как показано в следующих примерах:

Insert into the(select o.Line_items from orders о

WHERE o.id = 1)

SELECT 1, REF(p), 20 FROM parts p

WHERE id = 2;

Insert into the(select o.Line_items from orders о

WHERE o.id =1)

SELECT 2, REF(p), 10 FROM parts p

WHEREid= 11;

В приведенном ниже блоке PL/SQLдемонстрируется возможное использование программных переменных для ссылки на идентифика­торы объектов в операторахSELECT,INSERTиUPDATE. Для полного понимания выполняемых операций читайте комментарии:

DECLARE

-- объявление переменных для хранения ссылок на

-- идентификаторы объектов

custoid REF sales.Customer_Type;

partoid REF sales.Part_Type;

BEGIN

-- присвоить идентификатору объекта для Ларри

-- Эллисона имя CUSTOID

SELECT REF(c) INTO custoid FROM sales.customers с

WHERE c.last_name = 'Ellison'

AND c.first_name = 'Lawrence';

-- присвоить идентификатору объекта Pentium 200

-- имя PARTOID

SELECT REF(p) INTO partoid FROM sales.parts p

WHERE p.description = 'Pentium 200 CPU';

-- Ввести новый заказ для CUSTOID. В заказе

-- содержится один пункт с именем PARTOID.Присвоить

-- идентификатору нового объекта имя ORDOID