您的位置:首页 > 数据库 > Oracle

无效对象 oracle invalid object

2018-01-09 17:04 387 查看
-- 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’来查找失效对象,然后再编译;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 ORACLE