如何重编译ORACLE数据库的无效对象
上一篇 / 下一篇 2008-11-22 18:17:58 / 个人分类:Oracle
- 文件版本: V1.0
- 开发商: 本站原创
- 文件来源: 本地
- 界面语言: 简体中文
- 授权方式: 免费
- 运行平台: Win9X/Win2000/WinXP
查找无效对象51Testing软件测试网&[.y6C4L}cS
你可以根据这个查询结果来判断使用下面的哪种方法来编译你数据库里面的无效对象.51Testing软件测试网.gN%j^JY+}
COLUMNobject_name FORMAT A30SELECTowner,object_type,object_name,STATUSFROMdba_objectsWHERESTATUS='INVALID'ORDERBYowner,object_type,object_name;
G,lZn]})T]01.手动编译51Testing软件测试网.u
H5r7KL)OH
如果无效对象的数量很少,那么你可以逐个编译这些对象.
C.F0G8d/h0B4ysN0如:
ALTERPACKAGE my_package COMPILE;ALTERPACKAGE my_package COMPILE BODY;ALTERPROCEDURE my_procedure COMPILE;ALTERFUNCTIONmy_function COMPILE;ALTERTRIGGERmy_trigger COMPILE;ALTERVIEWmy_view COMPILE;
5G/j w{f&vj2x _0你也可以用DBMS_DDL包来编译(但只用于PL/SQL对象,所以你不用它来编译视图等):51Testing软件测试网Nf0m&J!V!c
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');
[T1Z"r+u*t02.通用脚本
0_ bu8^f)m%BD0在某些情况下你可能有很多无效对象要编译,这样话手工编译就显得效率太低了.51Testing软件测试网2W/Y+]n
cL@
在这种情况下你可以些一个通用的脚本生成编译脚本.51Testing软件测试网#KPf.a!G
下面的脚本用来查询无效的package 和package body并生成便宜这些对象的脚本.
"o4J&I;q1Rm-`1G0但是这方法不会考虑ORACLE对象之间的依赖关系.51Testing软件测试网3KUf0JR8Q
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;/
uOtP:Z1| v0F03.使用DBMS_UTILITY.compile_schema
C`8Cjm)SD0使用这个包将会编译指定schema下的所有procedures, functions, packages, and triggers.51Testing软件测试网/u.x}z6B;AJ2R*I]
你可以在sqlplus 下使用它,如:
Pdbo$oX0EXEC DBMS_UTILITY.compile_schema(schema => ‘SCOTT’);51Testing软件测试网!X(Vb\e!Ho
4.使用UTL_RECOMP
3S*tr2Exl+N;[6t0UTL_RECOMP包有两个存储过程:RECOMP_SERIAL和RECPMP_PARALLEL
w|1uCX0e(@0从存储过程的名字可以看出一个是非并行,一个是并行方式.51Testing软件测试网]-n|\$Yfb*yI+k0yr[
使用并行方式会加快编译速度,包的定义如下:
PROCEDURE RECOMP_SERIAL(51Testing软件测试网j&U8Gx;r'fyR
schema IN VARCHAR2 DEFAULT NULL,
JQ\+s:tWg0flags IN PLS_INTEGER DEFAULT 0);51Testing软件测试网;aH'B\Q!{i
I
a8O i)S%^0PROCEDURE RECOMP_PARALLEL(
#}U0aO&m