Изменение и удаление типов
. Для изменения объектного типа ис-
пользуется оператор ALTER TYPE, который можно использовать для
перекомпиляции описания или тела объектного типа, либо для добавле-
ния в тип новых методов.
Команда ALTER TYPE имеет следующий синтаксис:
ALTER TYPE имя_типа COMPILE [SPECIFICATION | BODY];
где имя_типа – имя изменяемого типа. С помощью этой команды
можно перекомпилировать спецификацию или тело типа, которые в
скомпилированном виде хранятся в словаре данных. Если не указывает-
ся ни SPECIFICATION, ни BODY, то перекомпилироваться будут как
198
описание, так и тело типа. Например, следующая команда вызывает пе-
рекомпиляцию тела типа BOOK_T:
ALTER TYPE BOOK_T COMPILE BODY;
Перекомпиляция объекта может потребоваться в случае, когда объект
в результате изменения связанных с данным объектом других объектов.
Другая форма команды ALTER TYPE используется для добавления к
типу новых методов. Она имеет следующий синтаксис:
ALTER TYPE имя_типа REPLACE AS OBLECT
(спецификация_объектного_типа);
где имя_muna – это имя объектного типа, а специфика-
ция_объектного_типа – полное описание типа, определенное командой
CREATE TYPE. Новое описание должно во всем, кроме дополнительных
методов, совпадать с исходным. Должны быть указаны первоначальные
атрибуты и типы. Если тело типа уже существует, оно становится недос-
товерным, поскольку в нем не описаны новые методы.
Использование команды ALTER TYPE ... REPLACE AS OBLECT ил-
люстрируется на следующем примере. Запросим статус объекта
BOOK_T.
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
FROM USER_OBJECTS
WHERE OBJECT_NAME = 'BOOK_T';
В результате получим сообщение о достоверности заголовка и тела
объекта BOOK_T.
OBLECT_NAME OBJECT_TYPE STATUS
--------------------------------------------------------------
BOOK_T TYPE VALID
BOOK_T TYPE BODY VALID
Изменим тип, добавив к нему новый метод. При этом тело типа стано-
вится недостоверным.
ALTER TYPE BOOK_T REPLACE AS OBJECT
( ID NUMBER(2), -- код книги
TITLE VARCHAR2(15), -- название книги
AUTHOR VARCHAR2(15), -- фамилия автора
PRICE NUMBER(7), -- цена книги
--Возвращает фамилию автора и название книги.
MEMBER FUNCTION FORMATTED_NAME
199
RETURN VARCHAR2,
--Обновляет поле PRICE значением, указанным в поле NEW_PRICE.
MEMBER PROCEDURE CHANGE_PRICE
(NEW_PRICE IN NUMBER),
--Возвращает код книги
MEMBER FUNCTION BOOK_ID RETURN NUMBER
);
Запросим еще раз статус объекта BOOK_T.
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
FROM USER_OBJECTS
WHERE OBJECT_NAME = 'BOOK_T';
В результате получим сообщение о недостоверности тела объекта
BOOK_T.
OBLECT_NAME OBJECT_TYPE STATUS
----------------------------------------------------------------
BOOK_T TYPE VALID
BOOK_T TYPE BODY INVALID
Пересоздадим тело типа BOOK_T с добавленным новым методом.
CREATE OR REPLACE TYPE BODY BOOK_T AS
MEMBER FUNCTION FORMATTED_NAME
RETURN VARCHAR2 IS
BEGIN
RETURN SELF.AUTHOR||SELF.TITLE;
END FORMATTED_NAME;
MEMBER PROCEDURE CHANGE_PRICE
(NEW_PRICE IN NUMBER) IS
BEGIN
PRICE := NEW_PRICE;
END CHANGE_PRICE;
MEMBER FUNCTION BOOK_ID RETURN NUMBER IS
BEGIN
RETURN ID;
END BOOK_ID;
END;
Запросим статус объекта BOOK_T.
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
200
FROM USER_OBJECTS
WHERE OBJECT_NAME = 'BOOK_T';
В результате получим сообщение о достоверности тела объекта
BOOK_T.
OBLECT_NAME OBJECT_TYPE STATUS
--------------------------------------------------------------
BOOK_T TYPE VALID
BOOK_T TYPE BODY VALID
Команда DROP TYPE используется для удаления объектного типа и
имеет следующий синтаксис:
DROP TYPE имя_типа [FORCE];
При этом если используется опция FORCE, то объектный тип удаля-
ется принудительно, несмотря на имеющиеся связи, и делая при этом не-
действительными все зависимое от него объекты. Если данный параметр
отсутствует, то объектный тип будет удален только в том случае, если на
него нет ссылок, т. е. при отсутствии в схеме других объектов, завися-
щих от данного объектного типа.
Команда
DROP TYPE BODY имя_типа
удаляет только тело объектного типа, не трогая спецификацию типа и
все зависимые от него объекты.
201
|