Как перекомпилировать объекты базы данных Oracle? Скрипт.
Существует пять способов:
- DBMS_DDL
- DBMS_UTILITY
- UTL_RECOMP
- UTLRP.SQL
- Ручная перекомпиляция
DBMS_DDL.ALTER_COMPILE
Эта процедура аналогична предложению:
ALTER <тип объекта> <наименование объекта> COMPILE [BODY];
Синтаксис
dbms_ddl.alter_compile ( type, schema, name);
--Type: Должен быть PROCEDURE, FUNCTION, PACKAGE, PACKAGE BODY илиTRIGGER.
--Schema: Имя пользователя базы данных
--Name: Имя объекта
Пример;
begin dbms_ddl.alter_compile ('PROCEDURE','SCOTT','TEST'); end;
DBMS_UTILITY.COMPILE_SCHEMA
Эта процедура компилирует все процедуры, функции, пакеты и триггеры в указанной схеме.
dbms_utility.compile_schema ( schema,compile all)
--Schema: Имя пользователя базы данных
--Compile All: Тип объекта PROCEDURE, FUNCTION, PACKAGE, PACKAGE BODY илиTRIGGER
begin dbms_utility.compile_schema('SCOTT'); end;
UTL_RECOMP
Этот скрипт очень полезен после обновления версии, потому что как правило после обновления статус INVALID получают все PL/SQL и Java объекты
Синтаксис
UTL_RECOMP.RECOMP_SERIAL ();
— Запускается под пользователем SYS
begin; UTL_RECOMP.RECOMP_SERIAL (); end;
UTLRP.SQL
Перекомпилирует все объекты PL/SQL, имеющие статус «INVALID», а именно процедуры, функции, типы и пакеты.
Расположен: $ORACLE_HOME/rdbms/admin
Пример
Запустить скрипт c:\oracle\product\10.1.0\db_1\rdbms\admin\UTLRP.SQL
— Запускается под пользователем SYS — Рекоммендован после обновления базы данных или после переноса
Ручная перекомпиляция
Список инвалидных объектов БД достаем запросом
SELECT object_type, object_name, owner, status FROM all_objects WHERE status <> 'VALID'
Дальше компилируем через среду разработки. Объекты подлежащие перекомпиляции
Объекты подлежащие перекомпиляции
- VIEW
- SYNONYM
- PUBLIC SYNONYM
- PROCEDURE
- FUNCTION
- PACKAGE
- PACKAGE BODY
- TRIGGER
- UNDEFINED (MATERIALIZED VIEW)
- JAVA CLASS
- TYPE
- TYPE BODY
Или скриптом
BEGIN -- перекомпилирование всех невалидных объектов в схеме #b1b100;">FOR CUR IN ( SELECT OBJECT_TYPE , OBJECT_NAME , OWNER , STATUS FROM ALL_OBJECTS WHERE STATUS <> 'VALID' ) LOOP BEGIN DBMS_DDL.ALTER_COMPILE ( CUR.OBJECT_TYPE, CUR.OWNER, CUR.OBJECT_NAME); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.put_line ('Ошибка компиляции объекта: ' || CUR.OWNER || '.' || CUR.OBJECT_NAME); END; END LOOP; END;