Создание объектного типа.
Объектный тип состоит:
1) из описания (заголовка, спецификации) объектного типа;
2) тела объектного типа.
В описании типа содержатся атрибуты и предварительные объявления
методов, а тело состоит из определений методов. Каждая из этих частей
компилируется отдельно, но пока не будет откомпилирован заголовок
объектного типа, не будет компилироваться и его тело.
Для создания заголовка объектного типа используется следующий
синтаксис:
CREATE [OR REPLACE] TYPE [схема.] имя_типа AS OBJECT
(имя_атрибута тип_данных [, имя_атрибута тип_данных] …]
[{MAP | ORDER} MEMBER описание_функции]
[MEMBER {описание_процедуры | описание_функции}
[, MEMBER {описание_процедуры | описание_функции}]...]
[PRAGMA RESTRICT_REFERENCES (имя_метода, ограничения)
184
[, PRAGMA RESTRICT_REFERENCES (имя_метода, ограничения)]...]
…);
где имя_типа – имя нового объектного типа, а схема – его владелец. Сна-
чала через запятую перечисляются атрибуты типа:
имя_атрибута тип_данных
где имя_атрибута – это имя атрибута, а тип_данных – встроенный тип
PL/SQL, или ранее определенный пользователем тип данных, или ссылка
на объектный тип. После атрибутов указываются методы объектного ти-
па. При описании методов каждый из них, кроме последнего, отделяется
запятой и выглядит как обычная хранимая подпрограмма PL/SQL с до-
бавлением ключевого слова MEMBER.
Прагма RESTRICT_REFERENCES используется для определения по-
рядка вызова метода из SQL-оператора.
Для создания тела объектного типа используется следующий синтак-
сис:
CREATE [OR REPLACE] TYPE BODY имя_типа AS
[{MAP | ORDER} MEMBER определение_функции]
[MEMBER {определение_процедуры | определение_функции}
[MEMBER {определение_процедуры | определение_функции}]...]
END;
причем в теле объектного типа должны быть реализованы все объявлен-
ные в заголовке процедуры и функции.
З а м е ч а н и я
1. При создании спецификации или тела пакета с помощью
SQL*PLUS, необходимо указывать в строке, следующей за последним
оператором, косую черту (/), чтобы оператор CREATE … TYPE выпол-
нился.
2. Описание атрибутов производится так же, как и описание полей
типа записи PL/SQL или столбцов таблицы в операторе CREATE
TABLE, но в отличие от полей записи атрибуты объектного типа нельзя
ограничивать как NOT NULL и инициализировать значениями по умол-
чанию.
3. Так как объектные типы хранятся в словаре данных, то типы дан-
ных для атрибутов должны быть только те, которые есть в языке SQL, за
исключением типов данных: LONG, LONG RAW, NCHAR, NVAR-
CHAR2, NCLOB и ROWID.
185
4. Не допускается использование типов данных, доступных в языке
PL/SQL: BINARY_INTEGER, BOOLEAN, PLS_INTEGER, RECORD,
REF CURSOR.
5. Запрещается использование в атрибутах объектного типа атрибу-
тов %TYPE и %ROWTYPE, но разрешается использование атрибута
%TYPE с атрибутами экземпляра объектного типа.
6. Функции MAP и ORDER используются для задания порядка сор-
тировки в данном объектном типе. Эти функции обсуждаются ниже.
7. Допускается создание объектных типов путем предварительного
объявления типа, которое аналогично предварительному объявлению
процедуры или метода:
CREATE TYPE имя_типа;
8. Тело объектного типа не может содержать операторы тех методов,
которые не указаны в спецификации типа.
Создадим объектный тип для сущности «книга». Атрибутами данного
типа являются код книги, название книги, фамилия автора, цена книги.
Объявим два метода: FORMATTED_NAME и CHANGE_PRICE, первый
из которых возвращает фамилию автора и название книги, а второй об-
новляет поле PRICE значением, указанным в поле NEW_PRICE. В каче-
стве имени объектного типа используем идентификатор BOOK_T. Сле-
дующая последовательность операторов создает спецификацию объект-
ного типа BOOK_T.
CREATE OR REPLACE TYPE BOOK_T AS OBJECT
( ID NUMBER(2), -- код книги
TITLE VARCHAR2(15), -- название книги
AUTHOR VARCHAR2(15), -- фамилия автора
PRICE NUMBER(7), -- цена книги
MEMBER FUNCTION FORMATTED_NAME
RETURN VARCHAR2,
MEMBER PROCEDURE CHANGE_PRICE
(NEW_PRICE IN NUMBER)
);
Создадим тело объектного типа BOOK_T:
CREATE OR REPLACE TYPE BODY BOOK_T AS
MEMBER FUNCTION FORMATTED_NAME
RETURN VARCHAR2 IS
BEGIN
RETURN SELF.AUTHOR||SELF.TITLE;
186
END FORMATTED_NAME;
MEMBER PROCEDURE CHANGE_PRICE
(NEW_PRICE IN NUMBER) IS
BEGIN
PRICE := NEW_PRICE;
END CHANGE_PRICE;
END;
Достарыңызбен бөлісу: |