ORACLE编译失效对象



数据库对象失效原因

数据库对象失效的原因很多,下面大致归纳了一些常见的原因:

1: 当被引用对象的结构变更时,都会使得相关的依赖对象转变为INVALID状态。

数据库中的对象(存储过程,函数,包,视图,触发器),它们往往需要直接或者间接的引用其它对象,对象的依赖包括直接和间接二种,其中直接依赖是指存储对象直接依赖于被引用对象,而间接依赖是指对象间接依赖于被引用对象

要查看被引用的对象,可以通过下面SQL查看

SELECT * FROM dba_dependencies WHERE NAME = ‘&objectname‘ ;

SELECT * FROM all_dependencies WHERE NAME = ‘&objectname‘ ;

SELECT * FROM user_dependencies WHERE NAME = ‘&objectname‘ ;

其实不管视图,像存储过程,函数、包等,如果代码本身没有什么错误,只是引用的对象发生了变化。也会失效。但并不影响调用,因为ORACLE在调用时会自动重新编译的,如果其它对象变化后导致编译有错误。这时调用时重新编译后也是错误并处于失效状态,所以调用会出错。

2:发布SQL脚本时(包、存储过程、函数等),没有充分测试,编译时出错,这时对象变为无效。

3: 数据库升级、迁移时,出现大量无效对象(本质原因,个人臆测归结为原因1)。

4: 诸如此类各种情况:例如,Oracle 会自动维护分区索引,对于全局索引,如果在对分区表操作时,没有指定update index,则会导致全局索引失效,需要重建。

编译失效对象的方法

统计失效的对象:

SELECT owner, object_name,
object_type, status

FROM dba_objects

WHERE status
= ‘INVALID‘

ORDER BY 1 , 2, 3 ;

编译失效的对象:

1:   使用ALTER *** COMPLIE语句手工进行编译,这个适用于少数、个别对象失效

alter package <schema name>.<package_name> compile;

alter package <schema name>.<package_name> compile body;

alter view <schema name>.<view_name> compile;

alter trigger <schema).<trigger_name> compile;

2:执行@$ORACLE_HOME/rdbms/admin/utlrp.sql脚本编译数据库失效对象。

许多情况下,由于数据库的升级或迁移,会导致数据库中的对象失效。由于对象之间可能存在复杂的倚赖关系,所以手工编译通常无法顺利通过。通常我们会在Oracle的升级指导中看到这个脚本,Oracle强烈推荐在migration/upgrade/downgrade之后,通过运行此脚本编译失效对象。但是注意,Oracle提醒,此脚本需要用SQLPLUS以SYSDBA身份运行,并且当时数据库中最好不要有活动事物或DDL操作,否则极容易导致死锁的出现(这是很容易理解的)。

Oracle highly recommends running this script towards the end of of any migration/upgrade/downgrade.

另外,utlrp.sql 里面其实调用了$ORACLE_HOME/rdbms/admin/utlrcmp.sql来编译失效对象。

3:ORACLE提供了自动编译的接口dbms_utility.compile_schema(user,false); 调用这个过程就会编译所有失效的过程、函数、触发器、包

exec dbms_utility.compile_schema( ‘SCOTT‘ )

4:SQL1:

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

object_type in ( ‘PACKAGE‘ ,‘FUNCTION‘ , ‘PROCEDURE‘, ‘TRIGGER‘ ,‘JAVA
SOURCE‘, ‘JAVA CLASS‘, ‘‘ )

;

spool off;

set heading on ;

set feedback on ;

set echo on ;

@run_invalid.sql

SQL2:

DECLARE

v_objname user_objects.object_name% TYPE ;

v_objtype user_objects.object_type% TYPE ;

CURSOR cur IS

SELECT object_name,
object_type

FROM user_objects

WHERE status
= ‘INVALID‘

AND object_type IN ( ‘FUNCTION‘,

‘JAVA
SOURCE‘ ,

‘JAVA
CLASS‘ ,

‘PROCEDURE‘ ,

‘PACKAGE‘ ,

‘TRIGGER‘ );

BEGIN

OPEN cur;

LOOP

FETCH cur

INTO v_objname,
v_objtype;

EXIT WHEN cur% NOTFOUND;

BEGIN

EXECUTE IMMEDIATE ‘alter
‘ || v_objtype || ‘
‘ || v_objname ||


Compile‘ ;

dbms_output.put_line( ‘编译‘ ||
v_objtype || ‘ ‘ ||
v_objname || ‘()成功‘ );

EXCEPTION

WHEN OTHERS THEN

dbms_output.put_line( ‘编译‘ ||
v_objtype || ‘ ‘ ||
v_objname ||

‘()失败.‘ || SQLERRM );

END ;

END LOOP ;

CLOSE cur;

END ;

时间: 2024-08-07 02:59:28

ORACLE编译失效对象的相关文章

如何编译失效对象

--编译失效对象 begin dbms_utility.compile_schema(user, false); end;

自动编译失效的Oracle数据库对象

昨天看有个帖子说到的失效对象重新编译的问题,然后发现自己公司里也出现莫名其妙的失效对象. --创建自动编译失效过程事务记录表 declare tabcnt integer := 0; begin select count(*) into tabcnt from dba_tables where table_name='RECOMPILE_LOG'; if tabcnt = 0 then execute immediate 'create table recompile_log(rdate dat

oracle重新编译失效对像

重新编译失效对像可执行utlrp.sql文件: SQL> @?/rdbms/admin/utlrp.sql TIMESTAMP -------------------------------------------------------------------------------- COMP_TIMESTAMP UTLRP_BGN 2016-08-24 13:04:49 DOC> The following PL/SQL block invokes UTL_RECOMP to recom

Oracle编译用户无效对象

在采用IMPDP/IMP工具迁移数据时,经常会提示无效对象的警告,需要采用如下方式处理. 1. 查询指定用户的无效对象 su – oracle sqlplus / as sysdba SQL> select owner,object_name,replace(object_type,' ','') object_type,to_char(created,'yyyy-mm-dd') as created,to_char(last_ddl_time,'yyyy-mm-dd') as last_ddl

Oracle笔记之对象权限与系统权限总结

对象权限与系统权限 创建表和创建session是系统权限: 系统管理员是有权限去訪问其它表的 以sys登录 sqlplus sys/on_change_install as sysdba; 创建用户wangwu create user wangwu identified by wangwu; 系统权限 grant create session to wangwu; grant create table to wangwu; grant unlimited tablespace to wangwu

使用oracle压缩blob对象

 1.使用oracle压缩blob对象 l_blob := utl_compress.lz_compress(l_blob); 2.将blob转换成clob FUNCTION blob_to_clob(blob_in IN BLOB) RETURN CLOB AS v_clob    CLOB; v_varchar VARCHAR2(32767 ); v_start   PLS_INTEGER := 1 ; v_buffer  PLS_INTEGER := 32767 ; tmp_num  

oracle 索引失效原因

摘自网络http://blog.chinaunix.net/uid-23622436-id-3184356.html oracle 索引失效的原因 分类: Oracle 1) 没有查询条件,或者查询条件没有建立索引 2) 在查询条件上没有使用引导列 3) 查询的数量是大表的大部分,应该是30%以上. 4) 索引本身失效 5) 查询条件使用函数在索引列上(见12) 6) 对小表查询 7) 提示不使用索引 8) 统计数据不真实 9) CBO计算走索引花费过大的情况.其实也包含了上面的情况,这里指的是

Oracle 索引失效的六大限制条件

[原创]能使 Oracle 索引失效的六大限制条件 Oracle 索引的目标是避免全表扫描,提高查询效率,但有些时候却适得其反. 例如一张表中有上百万条数据,对某个字段加了索引,但是查询时性能并没有什么提高,这可能是 oracle 索引失效造成的.oracle 索引有一些限制条件,如果你违反了这些索引限制条件,那么即使你已经加了索引,oracle还是会执行一次全表扫描,查询的性能不会比不加索引有所提高,反而可能由于数据库维护索引的系统开销造成性能更差. 下面就是总结的能使 Oracle 索引失效

Oracle 用户、对象权限、系统权限

--================================ --Oracle 用户.对象权限.系统权限 --================================  一.用户与模式 用户:对数据库的访问,需要以适当用户身份通过验证,并具有相关权限来完成一系列动作 SYS用户,缺省始终创建,且未被锁定,拥有数据字典及其关联的所有对象 SYSTEM用户,缺省始终创建,且未被锁定,可以访问数据库内的所有对象 模式(schema):是某个用户拥有所有对象的集合.具有创建对象权限并创建