重庆思庄Oracle、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3005|回复: 0
打印 上一主题 下一主题

[Oracle] 编译失效对象的三种方法

[复制链接]
跳转到指定楼层
楼主
发表于 2020-9-20 12:25:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
导致数据库中对象失效的原因有几种:1.当被引用对象的结构变更时,都会使得相关的依赖对象转变为INVALID状态
2.发布SQL脚本时(包、存储过程、函数等),没有充分测试,编译时出错,这时对象变为无效
3.数据库升级、迁移时,出现大量无效对象(本质原因应该是属于1)
4.诸如此类各种情况:例如,Oracle 会自动维护分区索引,对于全局索引,如果在对分区表操作时,没有指定update index,则会导致全局索引失效,需要重建
在遇到对象失效的情况下,就需要对这些对象进行重新编译:
查看失效对象
SQL>  select owner,object_name,object_type, status, count(*) from dba_objects where status='INVALID'
          group by owner, object_name,object_type, status
          order by owner, object_name,object_type;
重新编译失效对象有以下几种方法:
1.使用数据库带有的脚本进行编译
SQL>@$ORACLE_HOME/rdbms/admin/utlrp.sql
此脚本需要SQLPLUS以SYSDBA身份运行,并且当时数据库中最好不要有活动事物或DDL操作,否则极容易导致死锁的出现

2.使用ALTER *** COMPLIE语句手工进行编译,这个方法可以用于少数、个别对象失效
alter package <schema name>.<package_name> compile;
alter package <schema name>.<package_name> compile body;
alter view <shema name>.<view_name> compile;
alter trigger <schema>.<trigger_name> compile;
如:
SQL> select 'alter' ||' '||object_type || ' ' || owner || '.' ||object_name ||' ' || 'compile;'
  2  from dba_objects where status='INVALID' and object_type='PACKAGE';
'ALTER'||''||OBJECT_TYPE||''||OWNER||'.'||OBJECT_NAME||''||'COMPILE;'
---------------------------------------------------------------------------------------------------
alter PACKAGE APEX_030200.WWV_FLOW_UTILITIES compile;
alter PACKAGE APEX_030200.WWV_FLOW_LOAD_DATA compile;

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






分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2024-4-29 05:45 , Processed in 0.082137 second(s), 20 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表