如何重编译ORACLE数据库的无效对象
上一篇 / 下一篇 2008-11-22 18:17:58 / 个人分类:Oracle
- 文件版本: V1.0
- 开发商: 本站原创
- 文件来源: 本地
- 界面语言: 简体中文
- 授权方式: 免费
- 运行平台: Win9X/Win2000/WinXP
查找无效对象
dKj
m/i`5_0你可以根据这个查询结果来判断使用下面的哪种方法来编译你数据库里面的无效对象.51Testing软件测试网bn#So)D
z#w"mQ I
COLUMNobject_name FORMAT A30SELECTowner,object_type,object_name,STATUSFROMdba_objectsWHERESTATUS='INVALID'ORDERBYowner,object_type,object_name;
0X }%P[5c"Ww+P/f01.手动编译51Testing软件测试网#^,DVI}5N!C
如果无效对象的数量很少,那么你可以逐个编译这些对象.
\T;r"pr0如:
ALTERPACKAGE my_package COMPILE;ALTERPACKAGE my_package COMPILE BODY;ALTERPROCEDURE my_procedure COMPILE;ALTERFUNCTIONmy_function COMPILE;ALTERTRIGGERmy_trigger COMPILE;ALTERVIEWmy_view COMPILE;
你也可以用DBMS_DDL包来编译(但只用于PL/SQL对象,所以你不用它来编译视图等):
'Fq?VEz&c9o0EXEC 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.通用脚本51Testing软件测试网1j(Gk_@ B
在某些情况下你可能有很多无效对象要编译,这样话手工编译就显得效率太低了.51Testing软件测试网
K]:JQwb
在这种情况下你可以些一个通用的脚本生成编译脚本.51Testing软件测试网4vw2Lx
]6mUG
下面的脚本用来查询无效的package 和package body并生成便宜这些对象的脚本.
Mf)~.F*qS)YaZ]0但是这方法不会考虑ORACLE对象之间的依赖关系.
SETSERVEROUTPUTONSIZE1000000BEGINFORcur_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
[w,y^ Y:h0使用这个包将会编译指定schema下的所有procedures, functions, packages, and triggers.
b!`2g$da N.`P'o0你可以在sqlplus 下使用它,如:
[,y
B6w(]yv8y"F0EXEC DBMS_UTILITY.compile_schema(schema => ‘SCOTT’);51Testing软件测试网8h,R
u_y:b[
4.使用UTL_RECOMP51Testing软件测试网1Rw1SE0K^+r(t\
UTL_RECOMP包有两个存储过程:RECOMP_SERIAL和RECPMP_PARALLEL51Testing软件测试网"h_)d(_/Rl
从存储过程的名字可以看出一个是非并行,一个是并行方式.51Testing软件测试网;gQ ]X*I%U{5B
使用并行方式会加快编译速度,包的定义如下:51Testing软件测试网2F3e@~R:AN }
J