2) Объекты могут быть двух типов: устойчивые (те, которые хранятся в таблицах, т.е. являются либо строками, либо столбцами таблицы); и неустойчивые (все остальные).
Пример.
Создать объектный тип, содержащий сведения об отделе.
CREATE[OR REPLACE] TYPE DEPT_ T AS OBJECT
(ID NUMBER(2), -- номер отдела
NAME VARCHAR2(15), -- фамилия начальника
LOC VARCHAR2(15)); -- месторасположение отдела
Создать таблицу, строкой которой будет данный объектный тип.
CREATE TABLE DEPT OF DEPT_T;
Такая таблица называется объектной таблицей, объектом является строка, атрибуты которой определены в объектном типе DEPT_T и ID, NAME, LOC являются столбцами таблицы.
Вставка новых значений в таблицу осуществляется через конструктор.
Конструктор – это функция, создаваемая системой по умолчанию, имя которой совпадает с именем типа, а список параметров – со списком атрибутов и возвращаемым типом является объект.
INSERT INTO DEPT
VALUES(DEPT_T(30,'JONSON','CHIKAGO'));
Для того чтобы создать объектную таблицу, в целях сопряжения с реляционными методами, которые были до этого в БД, допускается и обычная вставка, при условии, что в списке атрибутов нет других встроенных объектных типов.
INSERT INTO DEPT
VALUES(20,'SCOTT','WASHINGTON');
В таком случае можно выполнять операции DELETE и UPDATE как над обычными реляционными таблицами.
Создать таблицу, столбцом которой является объектный тип.
CREATE TABLE EMP
(EMPNO NUMBER(4),
ENAME VARCHAR2(11),
OTDEL DEPT_T);
В данном случае ввести данные без конструктора нельзя, т.е. ввод новых значений будет иметь вид:
Выбрать информацию можно с помощью обычного оператора SELECT:
SELECT * FROM EMP;
На экран будет выведено:
EMPNO ENAME OTDEL(ID, NAME, LOC)
1111 KLARK DEPT_T(40,'JONSON','ATLANTA')
Т.е. OTDEL рассматривается как единое целое, и обратиться непосредственно к какому-то отдельному элементу нельзя.
Если необходимо выбрать некоторую информацию по объекту, то выполнить эку операцию как в реляционной БД нельзя.
SELECT ENAME FROM EMP
WHERE OTDEL=DEPT_T(40,'JONSON','ATLANTA');
Тоже самое касается операторов DELETE, UPDATE.
Это не совсем удобно, поэтому на практике такие таблицы строят следующим образом, учитывая, что существует таблица, где эти строки присутствуют:
CREATE TABLE EMP12
(EMPNO NUMBER(4),
ENAME VARCHAR2(11),
OTDEL REF DEPT_T);
REF – ссылка на объект, которая получает адрес объекта.
Когда формируется объектная таблица, где объекты – строки, то каждому объекту присваивается уникальный номер (идентификатор). Если даже объект удаляется, этот номер никакому другому объекту никогда не присваивается. Номер может достигать значения 2128.
Для вставки информации в такую таблицу, используют следующую конструкцию:
INSERT INTO EMP
SELECT 1111,'JOHN', REF(D)
FROM DEPT1 D
WHERE ID=10
Строка с ID=10 имеет уникальный номер, с помощью REF(D) получаем адрес объекта, и он станет на место третьего параметра.
В данном случае необходимо использовать синонимы. D не является синонимом в чистом виде, это так называемая переменная корреляции.
Если необходимо просмотреть нашу таблицу, то можно использовать следующий оператор:
SELECT * FROM EMP;
Но в этом случае на экран выведется следующее:
EMPNO ENAME OTDEL
1111 KLARK (здесь будет выведено ОЧЕНЬ длинное число)
Поэтому для выдачи более понятной информации используем:
SELECT EMPNO, ENAME, DEREF(OTDEL) FROM EMP12;
В результате получим:
1111 KLARK DEPT_T(40,'JONSON','ATLANTA')
Здесь DEREF возвращает по ссылке объект.
Если необходимо изменить, то:
UPDATE EMP SET ENAME='SASHA'
WHERE DEREF(OTDEL)=DEPT_T(40,'JONSON','ATLANTA');
Так как ссылку никому присваивать нельзя, в противном случае выдаст ошибку, что присваивается слишком большое значение.