
- •Объектно-ориентированные средства
- •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
- •Соблюдение взаимосвязей
- •Контрольные вопросы.
Какую работу нужно написать?
Insert into sales.Orders
Values (sales.Order_Type (1,custoid,sysdate,null,
sales.item_List(sales.item_Type(1,partoid,50))));
EXCEPTION
WHEN NO_DATA_FOUND THEN
raise_application_error(-20000,'No data found');
END;
Может показаться, что описание операций, необходимых для ввода данных в объектные таблицы, не столь понятно, как соответствующий реляционный синтаксис SQL. Но не забывайте и о том, что для работы с чем-то новым обычно всегда требуется некоторый опыт.
Удобство использования объектных таблиц, идентификаторов объектов и объектных ссылок становится очевидным при необходимости получить связанную информацию объектных таблиц. Вместо создания сложных запросов, как это требуется в реляционных системах, можно воспользоваться расширенной формой уточняющей записи через точку для тех атрибутов объектных таблиц, которые являются объектными ссылками. Чтобы упростить SQL-программы, в Oracleпредусмотрен автоматический поиск объектных ссылок. Например, следующий объектный запрос возвращает связанную информацию объектных таблицORDERSиCUSTOMERS.
SELECT о.id, o.customer.company_name
FROM sales.orders о;
Id customer.Company_name
---- ---------------------
1 Oracle Corporation
В реляционной же системе разработчику пришлось бы узнавать, какое отношение существует между таблицамиORDERSиCUSTOMERS, а затем программировать это отношение в каждом запросе, соединяющем информацию двух связанных таблиц, например:
SELECT о.id, o.company_name
FROM sales.orders o, sales.customers с
WHERE o.cust_id = c.id;
Вернемся к нашей системе, состоящей из объектных таблиц, и рассмотрим запрос, считывающий информацию из вложенной таблицы ITEMSи связанной с ней объектной таблицыPARTS:
SELECT o.item_id, o.part.description, o.quantity
FROM THE(SELECT line_items FROM sales.orders
WHERE id = 1) o;
Item_id part.Description quantity
------- ---------------- --------
1Pentium 200 cpu 50
Хотя предыдущий пример несколько проще, теперь вы должны понимать, в чем заключается польза от применения объектных таблиц и как создавать, а затем применять их при разработке приложений для работы с базами данных.
Соблюдение взаимосвязей
В предыдущих примерах было показано, как использовать объектные типы для создания объектов баз данных, например таблиц и хранимых процедур. При создании объектов необходимо учитывать, что при этом строится некоторое дерево взаимосвязей (dependencies),возникающих между объектами и объектными типами базы данных, и это дерево должно оставаться невредимым.Oracleконтролирует соблюдение взаимосвязей и не дает пользователям их нарушать. В любое время можно обратиться с запросом к словарю данных и вывести на экран взаимосвязи, существующие между объектами. Например, следующий запрос, который выполняется пользователем, присоединенным какSALES, показывает взаимосвязи, существующие между таблицейSALES.CUSTOMERSи типамиPUB.ADDRESS_TYPEиSALES.CUSTOMER_TYPE:
SELECT * FROM user_dependencies
ORDER BY name, type;
NAME TYPE REFERENCED_OWNER REFERENCED_NAME REFERENCED_TYPE
--------- ----- ---------------- --------------- ---------------
CUSTOMERS TABLE PUB ADDRESS_TYPE TYPE
CUSTOMERS TABLE SALES CUSTOMER_TYPE TYPE
Взаимосвязи не нарушаются, когда ничего не нужно изменять. Однако на практике изменения неизбежны, и в этом случае взаимосвязи, существующие между объектами, могут доставить множество хлопот. Предположим, нужно расширить тип CUSTOMER_TYPEс помощью нового атрибутаPHOTO. ТаблицаCUSTOMERSзависит отCUSTOMER_TYPE, и поэтому нельзя изменить описаниеCUSTOMER_ TYPE, если вначале не удалить таблицуCUSTOMERS. В заключение хочется посоветовать тщательнее проектировать объектные типы для баз данных, чтобы сразу принимать правильное решение. Затем остается только надеяться, что ничего не изменится после ввода системы в эксплуатацию.