oracle 編譯無效對象


在數據庫中,會存在一些無效的對象,導致這種現象的發生原因很多,其中最常見的就是數據庫升級(例如修改了表的結構),遷移而引起。

編譯無效對象的方式:

1 使用alter **** compile 語句進行編譯 
  
2 以SYSDBA用戶,執行ORACLE_HOME/rdbms/admin/utlrp.sql 腳本 

注:執行時數據庫中最好不要有活動事物或DDL操作,否則極容易導致死鎖的出現,另外,utlrp.sql 里面其實調用了$ORACLE_HOME/rdbms/admin/utlrcmp.sql來編譯失效對象。
 這個腳本是對整個數據庫中的對象進行重新編譯的,一般都是在遷移或者升級之后運行該腳本。
3 用DBMS_UTILITY包來進行編譯. 

注:ORACLE提供了自動編譯的接口dbms_utility.compile_schema(user,false); 調用這個過程就會編譯所有失效的過程、函數、觸發器、包

exec dbms_utility.compile_schema( 'SCOTT' )

 

 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_invalid

2)在SQL*Plus中執行

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

注:路徑不能有中文

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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM