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;

相關文章
相關標籤/搜索