oracle查询无效的object,无效对象 oracle invalid object

当数据库经历变更或迁移后,可能导致对象失效。本文介绍了三种重新编译无效对象的方法,包括使用ALTER...COMPILE语句、执行utlrp.sql脚本以及利用DBMS_UTILITY包。重点讨论了每种方法的适用场景和限制,特别是针对视图的编译问题。建议在执行utlrp.sql时以SYSDBA用户身份并避免并发DDL操作,以防止可能的死锁。同时,推荐使用PL/SQL Developer工具进行失效对象的查找和编译。
部署运行你感兴趣的模型镜像

-- 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’来查找失效对象,然后再编译;

您可能感兴趣的与本文相关的镜像

Qwen-Image-Edit-2509

Qwen-Image-Edit-2509

图片编辑
Qwen

Qwen-Image-Edit-2509 是阿里巴巴通义千问团队于2025年9月发布的最新图像编辑AI模型,主要支持多图编辑,包括“人物+人物”、“人物+商品”等组合玩法

### 查询无效对象的统计信息 在 Oracle 数据库中,可以通过查询 `DBA_OBJECTS` 视图来获取所有状态为 `INVALID` 的对象信息。以下 SQL 语句可以用于统计不同模式下各类无效对象的数量: ```sql SELECT owner, object_type, status, COUNT(*) FROM dba_objects WHERE status = 'INVALID' GROUP BY owner, object_type, status ORDER BY owner, object_type; ``` 该查询将返回每个模式中每种类型的无效对象数量,帮助识别哪些对象需要进一步处理[^4]。 ### 查询具体的无效对象并生成编译语句 为了更详细地查看具体的无效对象,并生成重新编译这些对象所需的 SQL 语句,可以使用以下查询: ```sql SELECT 'ALTER ' || object_type || ' ' || owner || '.' || object_name || ' COMPILE;' FROM dba_objects WHERE status = 'INVALID' ORDER BY object_type; ``` 此查询的结果是一系列 `ALTER ... COMPILE` 命令,可用于手动重新编译每一个无效对象[^3]。 ### 自动化编译无效对象 对于大规模数据库环境,Oracle 提供了脚本 `utlrp.sql` 来自动编译所有无效对象。此脚本通常位于 `$ORACLE_HOME/rdbms/admin/` 目录下,并调用了 `utlrcmp.sql` 脚本来完成实际的编译工作。执行此脚本前需要注意以下几点: - 必须以 `SYSDBA` 权限登录数据库。 - 确保数据库中没有正在进行的事务或 DDL 操作,以避免死锁问题。 - 推荐在数据库升级、迁移或降级后运行此脚本,以确保所有依赖对象正确编译通过[^1]。 ### 无效对象的常见原因及处理建议 无效对象通常是由于数据库升级、迁移或对象依赖关系发生变化所导致。大多数情况下,当某个无效对象被调用时,系统会尝试自动重新编译它。然而,如果对象存在语法错误或依赖项缺失,则需要人工干预进行修复。定期检查数据库中的无效对象是维护数据库健康的重要步骤。特别是数据迁移操作之后,应重点检查视图、存储过程、函数和同义词等对象的状态[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值