Объект-столбец
(column object) занимает ровно один столбец табли-
цы. Для создания таблицы, содержащей объект-столбец, нужно просто
указать объектный тип в качестве типа столбца в операторе CREATE
TABLE. Допускается в такой таблице наличие и скалярных типов. Для
примера создадим таблицу BOOK_DELIVERY на базе описанного выше
типа BOOK_T:
CREATE TABLE BOOK_DELIVERY
(SALESMAN VARCHAR2(15),
QUANTITY NUMBER(7),
BOOK BOOK_T);
Таблица BOOK_DELIVERY состоит из трех столбцов, один из кото-
рых является объектным типом. В данном случае ввести информацию в
таблицу без конструктора нельзя, т. е. для ввода новых значений необхо-
димо использовать следующую конструкцию:
INSERT INTO BOOK_DELIVERY
VALUES ('Иванов И. И.', 5, BOOK_T(10, 'Казаки', 'Толстой Л.', 5000));
В противном случае будет выдана ошибка.
Информацию из таблицы можно выбрать обычным способом с помо-
щью оператора SELECT:
SELECT * FROM BOOK_DELIVERY;
На экран будет выведено:
Иванов И. И. 5 BOOK_T(10, 'Казаки', 'Толстой Л.', 5000));
То есть столбец BOOK_T рассматривается как единое целое, обра-
титься непосредственно к какому-то отдельному элементу нельзя.
Кроме того, можно сослаться на объект-столбец в условии WHERE,
указав перечень значений атрибутов этого объекта. Ниже приведен при-
мер использования оператора SELECT.
SELECT SALESMAN FROM BOOK_DELIVERY
WHERE BOOK = BOOK_T(10, 'Казаки', 'Толстой Л.', 5000);
То же самое касается операторов DELETE, UPDATE.
Отметим, что в блоке PL/SQL для выполнения данного оператора для
таблицы необходимо указать псевдоним.
194
DECLARE
CURRENT_BOOK BOOK_T;
BEGIN
SELECT BOOK INTO CURRENT_BOOK
FROM BOOK_DELIVERY D
WHERE D.BOOK.ID = 10;
END;
Иногда на практике такие таблицы, в которых имеются объекты-
столбцы, учитывая, что существует таблица, где эти строки присутству-
ют, строят следующим образом. В столбце указывается не объектный
тип, а ссылка на этот тип.
CREATE TABLE BOOK_DELIVERY_M
(SALESMAN VARCHAR2(15),
QUANTITY NUMBER(7),
BOOK REF BOOK_T);
Для вставки информации в такую таблицу используют следующую
конструкцию:
INSERT INTO BOOK_DELIVERY_M
SELECT 'Иванов И. И.', 5, REF(B)
FROM BOOK_S B
WHERE ID = 10;
Строка с ID = 10 имеет уникальный идентификатор, который извлека-
ется с помощью операции REF(B) и размещается в столбце. В данном
случае также необходимо использование синонима. Для просмотра ин-
формации таблицы можно использовать следующий оператор:
SELECT * FROM BOOK_DELIVERY_M;
Но в этом случае на экран выведется вместо третьего атрибута очень
длинное число – идентификатор объекта. Поэтому для выдачи информа-
ции лучше использовать следующий вариант:
SELECT SALESMAN, QUANTITY ,
DEREF(BOOK) FROM BOOK_DELIVERY_M;
В результате получим следующую строку:
Иванов И. И. 5 BOOK_T(10, 'Казаки', 'Толстой Л.',5000));
В данном случае операция DEREF возвращает объект по ссылке. Если
необходимо изменить информацию в таблице, то оператор UPDATE за-
писывают в следующем виде:
195
UPDATE BOOK_DELIVERY_M SET SALESMAN = 'Петров П. П.'
WHERE DEREF(BOOK) = BOOK_T(10, 'Казаки', 'Толстой Л.', 5000);
Достарыңызбен бөлісу: |