无效对象 oracle invalid object

-- Created on 2012/8/17 by ZHOUXX
declare
  -- Local variables here
  i integer;
  v_sql varchar2(2000);
  ERR1 varchar2(2000);
  TOM_SQLCODE  varchar2(2000);
begin
  -- Test statements here
/*  for R in (select 'alter ' || object_type || ' ' || owner || '.' ||
                   object_name || ' compile' as vsql
              from dba_objects
             where owner = 'YDQXN'
               and object_type in
                   ('PACKAGE,', 'TRIGGER', 'FUNCTION', 'PROCEDURE','VIEW')
               and status <> 'VALID') loop
    --execute immediate R.vsql;
    v_sql :=R.vsql;
    end loop;*/


    for invalid_object in (select owner,object_name,object_type
                               from dba_objects
                               where status = 'INVALID' and owner = 'YDQXN')
    LOOP
     begin
      IF invalid_object.object_type IN ('PROCEDURE','TYPE','FUNCTION','PACKAGE','VIEW','TRIGGER')
        THEN
        v_sql := 'ALTER '||invalid_object.object_type||' '||invalid_object.owner||'.'||invalid_object.object_name || ' COMPILE ;';
        dbms_output.put_line(v_sql);
        execute immediate v_sql;
      end if;
      exception
        when others then
          ERR1        := SUBSTR(SQLERRM, 1, 100);
         TOM_SQLCODE := SQLCODE;
      end ;
    end loop;


end;


http://www.zxbc.cn/html/20070919/25834.html


有两种编译无效对象的方式:
 
1 使用alter **** compile 语句进行编译
 
2 以SYSDBA用户,执行ORACLE_HOME/rdbms/admin/utlrp.sql 脚本
 
3 用DBMS_UTILITY包来进行编译.


Raymond提出的方法
Raymond 在Recompiling invalid objects提到了如何有效地重新编译无效对象.提到了三种比较有效地方法(
 利用$ORACLE_HOME/rdbms/admin下的utlrp.sql脚本编译.一般都是在迁移或者升级之后运行该脚本.Raymond说该方法的不足之处在于这个脚本是对整个数据库中的对象进行重新编译的,所以不可取.有网友指出utlrp.sql 实际上是调用utlrcmp.sql的这样就可以用utl_recomp包来做喽(这样就是比较好的方法). 
 用DBMS_UTILITY包来进行编译.但是也有一定的局限性. 
Raymond提到了自己的解决办法: 不过也立刻有人指出来,这样对 View 的重新编译是无能为力的(ALTER_COMPILE只能处理:PACKAGE, PACKAGE BODY, PROCEDURE, FUNCTION, TRIGGER).参见下面的脚本



http://blog.163.com/microsunny_lin/blog/static/24266622200710325635504/


    很多时候,由于数据库的变更或迁移,会导致数据库中的对象失效。比如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’来查找失效对象,然后再编译;



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-无-为-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值