查询无效对象SQL:
  
 SELECT COUNT (*)
  FROM user_objects
  WHERE object_type IN ('PROCEDURE','FUNCTION','TRIGGER','VIEW','PACKAGE')
    AND status = 'INVALID';
 
 
 
  很多时候,由于数据库的变更或迁移,会导致数据库中的对象失效。比如EXP/IMP操作后,由于对象之间可能存在复杂的倚赖关系,所以手工编译通常无法顺利通过。Oracle提供一个脚本用于按照顺序/依赖关系重新编译失效对象。
 
       这个脚本是:
 $ORACLE_HOME/rdbms/admin/utlrp.sql  
 其中会调用:
 $ORACLE_HOME/rdbms/admin/utlrcmp.sql
 
 $Oracle_Home = Oracle的安装根目录 (d:\oracle\ora92)
 
        这是一个通用脚本,可以在任意时候运行以重新编译数据库失效对象。通常我们会在Oracle的升级指导中看到这个脚本,Oracle强烈推荐在migration/upgrade/downgrade之后,通过运行此脚本编译失效对象。但是注意,Oracle提醒,此脚本需要用SQLPLUS以SYSDBA身份运行,并且当时数据库中最好不要有活动事物或DDL操作,否则极容易导致死锁的出现(这是很容易理解的)。如果仔细阅读一下utlrcmp.sql脚本,大家就会知道Oracle的操作方式。
 
         执行命令如下:    
 SQL> conn sys/change_on_install@orcl as sysdba
 已连接。
 SQL> @d:\oracle\ora92\rdbms\admin\utlrp.sql;
 
 PL/SQL 过程已成功完成。
 表已创建。
 表已创建。
 表已创建。
 索引已创建。
 表已创建。
 表已创建。
 视图已建立。
 视图已建立。
 程序包已创建。
 
 没有错误。
 
 程序包主体已创建。
 
 没有错误。
 
 PL/SQL 过程已成功完成。
 PL/SQL 过程已成功完成。
 
  
 
        而在一般情况下,我们一般使用PLSQL Developer工具中的‘compile  Invalid  Objects’来查找失效对象,然后再编译;