oracle查询无效的object,无效对象 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值