Oracle中无效数据库对象的处理方法
Oracle总是会尝试自动重编译无效的PL/SQL对象和视图,但是可能不会成功。
虽然Oracle可能建议手动地进行编译,不过我们并非必须进行这个操作。
通常无效对象的产生是由于数据库迁移,针对无效对象,我们可以采取重编译和索引重建。
1.1、标识无效的对象
为了标识数据库中的所有无效的对象,我们可以作为SYSTEM用户或其他有权限的用户做如下查询。
SQL> select owner, object_name, object_type
from dba_objects
where status = 'INVALID';
1.2、修正无效的对象
编译对象
SQL> alter procedure ADD_NUMS compile;
Procedure altered.
如果编译成功,就不存在问题,如果编译失败,就需要找出失败的原因。
SQL> show errors
如果希望确定编译错误的原因,通常需要首先使用DBA_DEPENDENCIES视图。
SQL> desc dba_dependencies;
Name Null? Type
----------------------------------------- -------- ---------------
OWNER NOT NULL VARCHAR2(30)
NAME NOT NULL VARCHAR2(30)
TYPE VARCHAR2(17)
REFERENCED_OWNER VARCHAR2(30)
REFERENCED_NAME VARCHAR2(64)
REFERENCED_TYPE VARCHAR2(17)
REFERENCED_LINK_NAME VARCHAR2(128)
DEPENDENCY_TYPE VARCHAR2(4)
如果要重新编译成百上千的的无效对象,可以运行下面命令。
SQL> @?/rdbms/admin/utlrp
--编译无效对象脚本utlrp.sql
$ sqlplus '/as sysdba' @?/rdbms/admin/utlrp.sql
utlrp.sql脚本可以在数据库运行的状态下执行以编译、数据库中的invalid对象.
oracle建议在对数据库进行迁移、升级、降级后都运行一遍utlrp.sql以编译无效对象
编辑于联动北方技术论坛。