
- •Объектно-ориентированные средства
- •Instantiable] спецификация_метода, …, ]
- •Наследование типов.
- •Isdn in integer default null,
- •Методы сравнения.
- •Примеры создания и использования объектных типов
- •Создание специальных типов данных при помощи объектных типов
- •Id integer primary key,
- •Id, last_name, first_name,
- •Id last_name first_name address.Street1 ...
- •1 Ellison Lawrence 500 Oracle Parkway ...
- •Insert into sales.Customers values (
- •1, 'Ellison', 'Lawrence', 'Oracle Corporation',
- •Создание вложенных таблиц
- •Item_id integer,
- •Id integer primary key,
- •Insert into sales.Orders values (
- •1,Sysdate, null,
- •Insert into the(select line_items from sales.Orders
- •Id integer,
- •Id integer,
- •Item_id integer,
- •Id integer,
- •Insert into sales.Parts values (sales.Part_Type(1,
- •Insert into sales.Customers
- •Values(sales.Customer_Type(1,'Ellison','Lawrence',
- •Insert into sales.Orders
- •Insert into the(select o.Line_items from orders о
- •Insert into the(select o.Line_items from orders о
- •Insert into sales.Orders
- •Values (sales.Order_Type (1,custoid,sysdate,null,
- •Id customer.Company_name
- •1 Oracle Corporation
- •Item_id part.Description quantity
- •1Pentium 200 cpu 50
- •Соблюдение взаимосвязей
- •Контрольные вопросы.
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