описание, так и тело типа. Например, следующая команда вызывает пе-
рекомпиляцию тела типа 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