Существует пять способов:
- DBMS_DDL
- DBMS_UTILITY
- UTL_RECOMP
- UTLRP.SQL
- Ручная перекомпиляция
DBMS_DDL.ALTER_COMPILE
Эта процедура аналогична предложению:
ALTER PROCEDUREFUNCTIONPACKAGE [.] COMPILE [BODY]
Синтаксис
Exec dbms_ddl.alter_compile ( type , schema, name);
--Type : Должен быть PROCEDURE, FUNCTION, PACKAGE, PACKAGE BODY илиTRIGGER.
--Schema : Имя пользователя базы данных
--Name : Имя объекта
Пример
SQL> exec dbms_ddl.alter_compile ('PROCEDURE','SCOTT','TEST');
PL/SQL procedure successfully completed.
DBMS_UTILITY.COMPILE_SCHEMA
Эта процедура компилирует все процедуры, функции, пакеты и триггеры в указанной схеме.
Синтаксис
exec dbms_utility.compile_schema ( schema,compile all)
--Schema : Имя пользователя базы данных
--Compile All : Тип объекта PROCEDURE, FUNCTION, PACKAGE, PACKAGE BODY илиTRIGGER
Пример
SQL> exec dbms_utility.compile_schema('SCOTT');
PL/SQL procedure successfully completed.
UTL_RECOMP
Этот скрипт очень полезен после обновления версии, потому что как правило после обновления статус INVALID получают все PL/SQL и Java объекты
Синтаксис
Exec UTL_RECOMP.RECOMP_SERIAL ();
Пример
SQL> Exec UTL_RECOMP.RECOMP_SERIAL ();
PL/SQL procedure successfully completed.
-- Запускается под пользователем SYS
UTLRP.SQL
Перекомпилирует все объекты PL/SQL, имеющие статус "INVALID", а именно процеду, функции, типы и пакеты.
Расположен: $ORACLE_HOME/rdbms/admin
Пример
SQL> @c:\oracle\product\10.1.0\db_1\rdbms\admin\UTLRP.SQL
TIMESTAMP
-----------------------------------------------------------------------
COMP_TIMESTAMP UTLRP_BGN 2007-08-04 12:47:21
PL/SQL procedure successfully completed.
TIMESTAMP
-----------------------------------------------------------------------
COMP_TIMESTAMP UTLRP_END 2007-08-04 12:47:26
PL/SQL procedure successfully completed.
-- Запускается под пользователем SYS
-- Рекоммендован после обновления базы данных или после переноса
Ручная перекомпиляция
Лучше всего перекомпилировать объекты вручную
Spool recompile.sql
Select "alter "object_type" "object_name" compile;"
From user_objects
Where status <> "VALID"
And object_type IN ("VIEW","SYNONYM",
"PROCEDURE","FUNCTION",
"PACKAGE","TRIGGER");
Spool off
@recompile.sql
Note: VIEW,SYNONYM,PROCEDURE,PACKAGE,FUNCTION,TRIGGER
Spool pkg_body.sql
Select "alter package "object_name" compile body;"
From user_objects
where status <> "VALID"
And object_type = "PACKAGE BODY";
Spool off
@pkg_body.sql
Spool undefined.sql
select "alter materizlized view "object_name" compile;"
From user_objects
where status <> "VALID"
And object_type ="UNDEFINED";
Spool off
@undefined.sql
Spool javaclass.sql
Select "alter java class "object_name" resolve;"
from user_objects
where status <> "VALID"
And object_type ="JAVA CLASS";
Spool off
@javaclass.sql
Spool typebody.sql
Select "alter type "object_name" compile body;"
From user_objects
where status <> "VALID"
And object_type ="TYPE BODY";
Spool off
@typebody.sql
Spool public_synonym.sql
Select "alter public synonym "object_name" compile;"
From user_objects
Where status <> "VALID"
And owner = "PUBLIC"
And object_type = "SYNONYM";
Spool off
@public_synonym.sql
Объекты подлежащие перекомпиляции
- VIEW
- SYNONYM
- PUBLIC SYNONYM
- PROCEDURE
- FUNCTION
- PACKAGE
- PACKAGE BODY
- TRIGGER
- UNDEFINED (MATERIALIZED VIEW)
- JAVA CLASS
- TYPE
- TYPE BODY