oracle 編譯無效物件

2021-09-13 03:27:35 字數 3007 閱讀 2207

oracle 編譯無效物件

1.手動編譯

如果無效物件的數量很少,那麼你可以逐個編譯這些物件.

如alter package my_package compile;

alter package my_package compile body;

alter procedure my_procedure compile;

alter function my_function compile;

alter trigger my_trigger compile;

alter view my_view compile;

你也可以用dbms_ddl包來編譯(但只用於pl/sql物件,所以你不用它來編譯檢視等):

exec dbms_ddl('package','my_schema','my_package'); 

exec dbms_ddl('package body','my_schema','my_package'); 

exec dbms_ddl('procedure','my_schema','my_procedure'); 

exec dbms_ddl('function','my_schema','my_function'); 

exec dbms_ddl('trigger','my_schema','my_trigger');

2.通用指令碼

在某些情況下你可能有很多無效物件要編譯,這樣話手工編譯就顯得效率太低了.

在這種情況下你可以些乙個通用的指令碼生成編譯指令碼.

下面的指令碼用來查詢無效的package 和package body並生成便宜這些物件的指令碼.

但是這方法不會考慮oracle物件之間的依賴關係.

set serverout put on size 1000000 begin forcur_recin(selectowner,object_name,object_type,decode(object_type,'package',1,'package body',2,2)asrecompile_orderfromdba_objectswhereobject_typein('package','package body')andstatus!='valid'orderby4)loop 

beginifcur_rec.object_type='package'then 

execute immediate'alter '||cur_rec.object_type||' "'||cur_rec.owner||'"."'||cur_rec.object_name||'" compile'; 

else 

execute immediate'alter package "'||cur_rec.owner||'"."'||cur_rec.object_name||'" compile body'; 

endif; 

exception 

when others then 

dbms_output.put_line(cur_rec.object_type||' : '||cur_rec.owner||' : '||cur_rec.object_name); 

end; 

end loop; 

end;/

3.使用dbms_utility.compile_schema

使用這個包將會編譯指定schema下的所有procedures, functions, packages, and triggers.

你可以在sqlplus 下使用它,如:

exec dbms_utility.compile_schema(schema => 『scott』);

4.使用utl_recomp

utl_recomp包有兩個儲存過程:recomp_serial和recpmp_parallel

從儲存過程的名字可以看出乙個是非並行,乙個是並行方式.

使用並行方式會加快編譯速度,包的定義如下:

procedure recomp_serial(

schema in varchar2 default null,

flags in pls_integer default 0);

procedure recomp_parallel(

threads in pls_integer default null,

schema in varchar2 default null,

flags in pls_integer default 0);

引數使用方法:

schema

- 想編譯的模式,如果為null,將編譯資料庫的所有無效物件.

threads

- 並行度,如果為null,會使用引數job_queue_processes的值.

通常threads的值最好和cpu的數量想匹配,以發揮並行的最大優勢.

flags -

oracle內部使用的診斷測試引數.

如:-- schema level.exec utl_recomp.recomp_serial('scott'); 

exec utl_recomp.recomp_parallel(4,'scott'); 

-- database level.exec utl_recomp.recomp_serial(); 

exec utl_recomp.recomp_parallel(4); 

-- using job_queue_processes value.exec utl_recomp.recomp_parallel(); 

exec utl_recomp.recomp_parallel(null,'scott');

utl_recomp包的一些使用限制

(1).並行執行使用的是job佇列.當執行並行編譯的時候所有job都會被diable直到編譯完成.

(2).包必須在sqlplus中以sys使用者或者有sysdba許可權的使用者執行.

(3).utl_recomp依賴於dbms_standard,dbms_job,dbms_random

(4).如果在執行這個包的時候執行ddl語句可能會導致死鎖.

oracle 無效數字

湖南平衡電子地磅衡器廠,是專業從事工業稱重開發 生產 銷售 安裝與一體的集團公司,公司擁有創新 務實 開拓進取的精神,成為具有一定規模的製造公司。公司擁有國內的技術和裝置,產品質量優良 規格齊全 合理,並嚴格按照標準生產 製造。憑藉過硬的質量,良好的信譽,的售後服務,深受廣大客戶的信賴。為了避免給客...

mysql 物件名無效 SQL物件名無效的解決方法

問題一 使用sqlserver資料庫時,產生sql物件名無效的問題一般是以下兩種常見原因,下面根據不同的原因給出解決方法。原因一 新建的資料庫,沒有將初始資料匯入到新庫里。原因二 資料庫做過遷移,新資料庫的物件所有者名稱不同造成 資料庫做了遷移後,一般會進行匯入 還原資料的過程,在這個過程中,要注意...

在Oracle中重編譯所有無效的儲存過程

sql plus中,spool execcompproc.sql select alter procedure object name compile from all objects where status invalid and object type procedure spool off ...