Хранимые программные единицы, страница 5

Зависимыми могут быть следующие объекты базы данных:

·  Представления

·  Процедуры

·  Функции

·  Спецификации пакетов

·  Тела пакетов

·  Триггеры базы данных

Зависимые объекты могут содержать в своем описании ссылки на следующие объекты базы данных:

·  Таблицы

·  Представления

·  Последовательности

·  Синонимы

·  Процедуры

·  Функции

·  Спецификации пакетов

При изменении определения ссылаемого объекта, зависимые объекты приобретают статус INVALID. Статус объекта отображается в колонке STATUS представления USER_OBJECTS словаря данных. В зависимости от характера произведенных изменений в описании ссылаемого объекта, зависимый объект или может быть автоматически перекомпилирован сервером базы данных, или не может быть использован без внесения поправок.

Зависимости могут быть прямыми, когда зависимый объект прямо ссылается на объекты базы данных, или непрямыми, когда зависимый объект ссылается на объекты базы данных через другие объекты (подпрограмма ссылается на представление, которое зависит от таблицы базы данных).

Если все объекты находятся в одной и той же базе данных, обслуживаемой одним экземпляром Oracle, зависимости между ними являются локальными. В этом случае при изменении определения ссылаемого объекта, все зависимые объекты приобретают статус INVALID. При следующем обращении к такому объекту сервер Oracle автоматически перекомпилирует его. Если компиляция пройдет без ошибок, зависимый объект будет доступен. Этот процесс происходит прозрачно для пользователя, который может даже не заметить, что зависимый объект какое-то время имел статус INVALID. Немного увеличится время отклика, т.к. компиляция объекта занимает определенное время.

Информация о зависимостях

Информацию о прямых зависимостях между объектами базы данных можно получить через представление USER_DEPENDENCIES словаря данных.

Колонка

Описание

NAME

Имя зависимого объекта базы данных

TYPE

Тип зависимого объекта (PROCEDURE, FUNCTION, PACKAGE, PACKAGE BODY)

REFERENCED_OWNER

Схема, в которой находится ссылаемый объект

REFERENCED_NAME

Имя ссылаемого объекта

REFERENCED_TYPE

Тип ссылаемого объекта

SQL> SELECT name, type, referenced_name, referenced_type

  2  FROM user_dependencies

  3  WHERE referenced_name='EMP';

NAME                 TYPE         REFERENCED_NAME      REFERENCED_T

-------------------- ------------ -------------------- ------------

PRES_SAL             FUNCTION     EMP                  TABLE

EMP_SAL              PROCEDURE    EMP                  TABLE

Чтобы получить информацию о непрямых зависимостях, необходимо заполнить таблицы базы данных DEPTREE и IDEPTREE, выполнив хранимую процедуру DEPTREE_FILL. Таблицы и процедура должны быть предварительно созданы администратором базы данных.

Перекомпиляция хранимых подпрограмм

При изменении определения ссылаемых объектов сервер базы данных пытается автоматически перекомпилировать зависимые хранимые процедуры и функции при первом же обращении к ним. Если компиляция прошла успешно, перекомпилированные объекты приобретают статус VALID.

Хранимые программные единицы могут быть перекомпилированы явно с помощью команд DDL ALTER PROCEDURE и ALTER FUNCTION.

ALTER PROCEDURE имя_процедуры COMPILE

ALTER FUNCTION имя_функции COMPILE

Перекомпиляция зависимых объектов пройдет успешно

·  При добавлении колонки к ссылаемой таблице

·  Если типы данных ссылаемых колонок не изменяются

SQL> ALTER TABLE emp ADD (comments VARCHAR2(100));

Table altered.

SQL> SELECT object_name, object_type, status FROM user_objects

  2  WHERE object_type='PROCEDURE' OR object_type='FUNCTION';

OBJECT_NAME          OBJECT_TYPE        STATUS

-------------------- ------------------ -------

EMP_SAL              PROCEDURE          INVALID

PRES_SAL             FUNCTION           INVALID

SQL> SELECT ename, sal, pres_sal(sal) FROM emp WHERE LOWER(job)='clerk';

ENAME             SAL PRES_SAL(SAL)

---------- ---------- -------------

SMITH             800          1300

ADAMS            1100          1600

JAMES             950          1450

MILLER           1300          1800

SQL> SELECT object_name, object_type, status FROM user_objects

  2  WHERE object_type='PROCEDURE' OR object_type='FUNCTION';

OBJECT_NAME          OBJECT_TYPE        STATUS

-------------------- ------------------ -------

EMP_SAL              PROCEDURE          INVALID

PRES_SAL             FUNCTION           VALID

Перекомпиляция зависимых объектов пройдет с ошибками, если

·  Удален или переименован ссылаемый объект

·  Изменен тип данных ссылаемой колонки

·  Ссылаемое представление пересоздано с другими колонками

·  Изменен список формальных параметров ссылаемой подпрограммы

SQL> RENAME emp TO emp_new;

Table renamed.

SQL> SELECT object_name, object_type, status  FROM user_objects

  2  WHERE object_type='PROCEDURE' OR object_type='FUNCTION';

OBJECT_NAME          OBJECT_TYPE        STATUS

-------------------- ------------------ -------

EMP_SAL              PROCEDURE          INVALID

PRES_SAL             FUNCTION           INVALID

SQL> SELECT ename, sal, pres_sal(sal) FROM emp WHERE LOWER(job)='clerk';

SELECT ename, sal, pres_sal(sal) FROM emp WHERE LOWER(job)='clerk'

                                      *

ERROR at line 1:

ORA-00942: table or view does not exist

SQL> SELECT object_name, object_type, status FROM user_objects

  2  WHERE object_type='PROCEDURE' OR object_type='FUNCTION';

OBJECT_NAME          OBJECT_TYPE        STATUS

-------------------- ------------------ -------

EMP_SAL              PROCEDURE          INVALID

PRES_SAL             FUNCTION           INVALID

Чтобы перекомпиляция зависимых объектов после изменения определений ссылаемых объектов проходила успешно, выполняйте следующие рекомендации при создании программных единиц:

·  Описывайте локальные идентификаторы, используя атрибуты %TYPE и %ROWTYPE

·  При чтении данных из таблиц базы данных используйте нотацию SELECT *

·  При добавлении данных в таблицу базы данных явно указывайте список колонок в предложении INSERT

Литература

1.  Вильям Дж. Пэйдж Использование Oracle8/8i: пер. с англ. – М.: Издательский дом "Вильямс", 1999.