oracle 编译无效对象

在数据库中,会存在一些无效的对象,致使这种现象的发生缘由不少,其中最多见的就是数据库升级(例如修改了表的结构),迁移而引发。sql

编译无效对象的方式:数据库

1 使用alter **** compile 语句进行编译 
  
2 以SYSDBA用户,执行ORACLE_HOME/rdbms/admin/utlrp.sql 脚本 函数

注:执行时数据库中最好不要有活动事物或DDL操做,不然极容易致使死锁的出现,另外,utlrp.sql 里面其实调用了$ORACLE_HOME/rdbms/admin/utlrcmp.sql来编译失效对象。
 这个脚本是对整个数据库中的对象进行从新编译的,通常都是在迁移或者升级以后运行该脚本。
3 用DBMS_UTILITY包来进行编译. oop

注:ORACLE提供了自动编译的接口dbms_utility.compile_schema(user,false); 调用这个过程就会编译全部失效的过程、函数、触发器、包fetch

exec dbms_utility.compile_schema( 'SCOTT' )spa

 

 4 在SQL*plus中利用中间脚本编译 对象

1)建立脚本reCompile.sql接口

set heading off;
set feedback off;
set echo off;
Set lines 999;

Spool run_invalid.sql

select 'ALTER ' || OBJECT_TYPE || ' ' || OWNER || '.' || OBJECT_NAME || ' COMPILE;'
from dba_objects
where status = 'INVALID'
and OWNER = 'APPS'
and object_type in ('PACKAGE','FUNCTION','PROCEDURE','TRIGGER','JAVA SOURCE','JAVA CLASS','VIEW','SYNONYM');
select 'alter package ' || owner || '.' || object_name ||
' compile body;'
from dba_objects
where status = 'INVALID'
and OWNER = 'APPS'
and object_type in ('PACKAGE BODY');
spool off;
set heading on;
set feedback on;
set echo on;
@run_invalidit

2)在SQL*Plus中执行io

格式:@文件所在本地路径/文件名 

注:路径不能有中文

SQL> @C:\Users\Administrator\Desktop\aq\reCompile.sql;

备注:运行脚本reCompile.sql的时候,会建立另外一个脚本run_invalid,紧跟着执行该脚本,完成编译工做

 

5 编写PL/SQL利用游标编译

declare v_object_name user_objects.object_name%type; v_object_type user_objects.object_type%type; cursor cur is select t.object_name, t.object_type from user_objects t where t.status = 'INVALID' --and t.object_name like 'CUX%' and t.object_type in ('PROCEDURE', 'FUNCTION', 'TRIGGER', 'VIEW', 'SYNONYM', 'JAVA SOURCE', 'JAVA CLASS', 'PACKAGE', 'PACKAGE BODY');begin open cur; loop fetch cur into v_object_name, v_object_type; exit when cur%notfound; if v_object_type = 'PACKAGE BODY' then begin execute immediate 'alter package ' || ' ' || v_object_name || ' Compile body'; dbms_output.put_line('编译' || v_object_type || ' ' || v_object_name || '() 成功'); exception when others then dbms_output.put_line('编译' || v_object_type || ' ' || v_object_name || '() 失败.' || sqlerrm); end; else begin execute immediate 'alter ' || v_object_type || ' ' || v_object_name || ' Compile'; dbms_output.put_line('编译' || v_object_type || ' ' || v_object_name || '() 成功'); exception when others then dbms_output.put_line('编译' || v_object_type || ' ' || v_object_name || '() 失败.' || sqlerrm); end; end if; end loop; close cur;end;

相关文章
相关标签/搜索