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 ...