在数据库中,会存在一些无效的对象,导致这种现象的发生原因很多,其中最常见的就是数据库升级(例如修改了表的结构),迁移而引起。

编译无效对象的方式:

1 使用alter **** compile 语句进行编译 
  
2 以SYSDBA用户,执行ORACLE_HOME/rdbms/admin/utlrp.sql 脚本

注:执行时数据库中最好不要有活动事物或DDL操作,否则极容易导致死锁的出现,另外,utlrp.sql 里面其实调用了$ORACLE_HOME/rdbms/admin/utlrcmp.sql来编译失效对象。
 这个脚本是对整个数据库中的对象进行重新编译的,一般都是在迁移或者升级之后运行该脚本。
3 用DBMS_UTILITY包来进行编译.

注:ORACLE提供了自动编译的接口dbms_utility.compile_schema(user,false); 调用这个过程就会编译所有失效的过程、函数、触发器、包

exec dbms_utility.compile_schema( 'SCOTT' )

4 在SQL*plus中利用中间脚本编译

1)创建脚本reCompile.sql

set heading off;
set feedback off;
set echo off;
Set lines 999;

Spool run_invalid.sql

select 'ALTER ' || OBJECT_TYPE || ' ' || OWNER || '.' || OBJECT_NAME || ' COMPILE;'
from dba_objects
where status = 'INVALID'
and OWNER = 'APPS'
and object_type in ('PACKAGE','FUNCTION','PROCEDURE','TRIGGER','JAVA SOURCE','JAVA CLASS','VIEW','SYNONYM');
select 'alter package ' || owner || '.' || object_name ||
' compile body;'
from dba_objects
where status = 'INVALID'
and OWNER = 'APPS'
and object_type in ('PACKAGE BODY');
spool off;
set heading on;
set feedback on;
set echo on;
@run_invalid

2)在SQL*Plus中执行

格式:@文件所在本地路径/文件名

注:路径不能有中文

SQL> @C:\Users\Administrator\Desktop\aq\reCompile.sql;

备注:运行脚本reCompile.sql的时候,会创建另一个脚本run_invalid,紧跟着执行该脚本,完成编译工作

5 编写PL/SQL利用游标编译

declare
v_object_name user_objects.object_name%type;
v_object_type user_objects.object_type%type;
cursor cur is
select t.object_name, t.object_type
from user_objects t
where t.status = 'INVALID'
--and t.object_name like 'CUX%'
and t.object_type in ('PROCEDURE',
'FUNCTION',
'TRIGGER',
'VIEW',
'SYNONYM',
'JAVA SOURCE',
'JAVA CLASS',
'PACKAGE',
'PACKAGE BODY');
begin
open cur;
loop
fetch cur
into v_object_name, v_object_type;
exit when cur%notfound;
if v_object_type = 'PACKAGE BODY' then
begin
execute immediate 'alter package ' || ' ' || v_object_name ||
' Compile body';
dbms_output.put_line('编译' || v_object_type || ' ' || v_object_name ||
'() 成功');
exception
when others then
dbms_output.put_line('编译' || v_object_type || ' ' ||
v_object_name || '()
失败.' || sqlerrm);
end;
else
begin
execute immediate 'alter ' || v_object_type || ' ' || v_object_name ||
' Compile';
dbms_output.put_line('编译' || v_object_type || ' ' || v_object_name ||
'() 成功');
exception
when others then
dbms_output.put_line('编译' || v_object_type || ' ' ||
v_object_name || '()
失败.' || sqlerrm);
end;
end if;
end loop;
close cur;
end;

oracle 编译无效对象的更多相关文章

  1. Oracle EBS 重新编译无效对象 invalid object

    1.  查看数据库中的无效对象      check oracle object      SQL> select count(*) from dba_objects where status= ...

  2. ORACLE编译失效对象小结

    在日常数据库维护过程中,我们会发现数据库中一些对象(包Package.存储过程Procedure.函数Function.视图View.同义词.....)会失效,呈现无效状态(INVALID).有时候需 ...

  3. oracle compile 编译无效对象

    原博主:http://blog.csdn.net/tianlesoftware/article/details/4843600 Applies to: Oracle Server - Enterpri ...

  4. oracle编译 失效对象方式

    如果procedure 所使用的表结构发生了改变等其它情况,在相应的xxx_objects表的status字段会变为invalid状态,但是如果在调用时procedure会自动编译,grant失效对象 ...

  5. 转://oracle 重新编译用户无效对象

    select owner,object_name, replace(object_type,' ','') object_type,to_char(created,'yyyy-mm-dd') as c ...

  6. 处理Oracle数据中的无效对象

    今天还原了一份数据库(在服务器上没有无效对象),还原在本地之后有三十几个无效对象,当时很是郁闷,然后我发现还原之后的数据库中缺少表! 开始我怀疑Oracle数据库的还原功能,但是在我创建表的时候发现, ...

  7. sqlplus编译失效对象

    原文整理自:http://www.51testing.com/?uid-16403-action-viewspace-itemid-98161:http://www.eygle.com/archive ...

  8. oracle 编译中一个关于clntsh 库的一个 帖子 ,收藏!

    oracle 编译中一个关于clntsh 库的一个 帖子 ,收藏! ------------------------------------------------------------------ ...

  9. Oracle 参数化更新数据时报错:Oracle ORA-01722: 无效数字

    报错:Oracle ORA-01722: 无效数字 看了一篇博客,据说是参数与列名不能一致,改过之后还是报一样的错误:Oracle ORA-01722: 无效数字 ,后来试了一下,不是参数名必须不一样 ...

随机推荐

  1. shell 函数的高级用法

    函数介绍 linux shell中的函数和大多数编程语言中的函数一样 将相似的任务或者代码封装到函数中,供其他地方调用 语法格式 如何调用函数 shell终端中定义函数 [root@master da ...

  2. 流程控制 if----else

    流程控制: 对PHP程序执行的过程进行控制! PHP有哪些手段对程序执行过程进行控制!一.顺序执行 自上而下的执行即可! 对这个执行过程没有控制!二.分支执行 分支执行可以根据条件是否满足来选择执行某 ...

  3. springboot系列(九)springboot使用druid数据源

    Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB ...

  4. 记录java+testng运行selenium(一)

    整体的流程为下图 整体思路为: 1. 由程序开始运行时去读取ini文件中存储的浏览器及需要打开的url 2. test运行时通过description实现数据驱动,主要做两件事 2.1 第一件事为:读 ...

  5. 【python cookbook】找出序列中出现次数最多的元素

    问题 <Python Cookbook>中有这么一个问题,给定一个序列,找出该序列出现次数最多的元素.例如: words = [ 'look', 'into', 'my', 'eyes', ...

  6. hive之建立分区表和分区

    1. 建立分区表 create table 单分区表:其中分区字段是partdate,注意分区字段不能和表字段一样,否则会报重复的错 create table test_t2(words string ...

  7. 4.kafka生产者---向Kafka中写入数据(转)

    转:  https://www.cnblogs.com/sodawoods-blogs/p/8969513.html (1)生产者概览 (1)不同的应用场景对消息有不同的需求,即是否允许消息丢失.重复 ...

  8. Activity之launchMode理解

    对于Activity中的四个lauchMode[standard(默认).singleTop.singleTask.singleInstance]的介绍网上已经有大把的文章了,但是在实际应用开发时,对 ...

  9. Python经典算法-猴子吃桃-思路分析

    问题: 猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾就多吃了一个.第二天早上又将剩下的桃子吃了一半,还是不过瘾又多吃了一个.以后每天都吃前一天剩下的一半再加一个.到第10天刚好剩一个.问猴子第一天 ...

  10. Git----拉取远程分支,git pull,git rebase,git pull --rebase的区别

    git pull 相当于自动的 fetch 和 merge 操作,会试图自动将远程库合并入本地库,在有冲突时再要求手动合并. git rebase 可以确保生产分支commit是一个线性结构,方便ro ...