无效对象 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’来查找失效对象,然后再编译;
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 invalid object
- Oracle EBS 重新编译无效对象 invalid object
- Oracle EBS 重新编译无效对象 invalid object
- Oracle EBS 重新编译无效对象 invalid object
- EBS 重新编译无效对象 invalid object
- EBS 重新编译无效对象 invalid object
- EBS 重新编译无效对象 invalid object
- ORACLE批量编译无效对象
- Oracle中查看无效的对象、约束、触发器和索引
- 编译Oracle中无效的对象的N中方法
- ORACLE DBA_OBJECTS视图中OBJECT_TYPE为LOB的对象查看
- oracle12创建用户错误ORA-65096: 公用用户名或角色名无效 invalid common user or role name
- System.InvalidOperationException: 对象的当前状态使该操作无效
- Oracle SQLPLUS编译Invalid对象
- Oracle中查看无效的对象、约束、触发器和索引
- Oracle 传入、返回 object 类型的对象
- Oracle OCP笔记(23)性能管理 - 无效对象
- Oracle 对象类型(Object)
- Oracle Compile 编译 无效对象
- javax.management.MalformedObjectNameException: Invalid character '' in value part of property ,Oracle 驱动包的错误