`

[转载]Oracle 中重新编译无效的存储过程

阅读更多
Oracle 中的存储过程在有些情况下会变成失效状态,在 PL/SQL Developer 中该存储过程的图标左上角显示一把小红叉叉。比如储过程所引用的对象失效,dblink 出问题啦都可能引起用到它的存储过程失效。再就我的存储过程经常会变成无效,至今原因都未查明。

查询 dba_dependencies 视图可以看到存储过程所引用的对象,再就在 dba_objects 视图中可以看到对象的 created 和 last_ddl_time 时间。

上面的那种无效的存储程,只要不是语法上有问题,重新编译一下又是可用的了。总不能每次发现时人工去编译的,所以要实现自动化,有以下两种方法(网上找到的所有的 在Oracle中重新编译所有无效的存储过程 代码排版都很混乱,所以主要是重新整理了):

1. Oracle SQL *Plus 中 -- 用 spool 生成脚本文件,然后 @ 调入执行,代码如下:

  1. spool ExecCompProc.sql ??
  2. ??
  3. select 'alter procedure '||object_name||' compile;' from all_objects ??
  4. where status = 'INVALID' and object_type = 'PROCEDURE' AND owner='TCSM'; ??
  5. ??
  6. spool off??
  7. ??
  8. @ExecCompProc.sql;??
spool ExecCompProc.sqlselect 'alter procedure '||object_name||' compile;' from all_objectswhere status = 'INVALID' and object_type = 'PROCEDURE' AND owner='TCSM';spool off@ExecCompProc.sql;
2. 写成一个存储过程 -- 让这个存储过程在某个时机执行,比如 Job 中,代码如下:

  1. create or replace procedure compile_invalid_procedures( ??
  2. ???? p_owner varchar2 -- 所有者名称,即 SCHEMA ??
  3. ) as??
  4. ??
  5. --编译某个用户下的无效存储过程 ??
  6. ??
  7. ???? str_sql varchar2(200); ??
  8. ???? ??
  9. begin??
  10. ????for invalid_procedures in (select object_name from all_objects ??
  11. ???????where status = 'INVALID' and object_type = 'PROCEDURE' and owner=upper(p_owner)) ??
  12. ???? loop ??
  13. ???????? str_sql := 'alter procedure ' ||invalid_procedures.object_name || ' compile'; ??
  14. ????????begin??
  15. ????????????execute immediate str_sql; ??
  16. ???????? exception ??
  17. ??????????--When Others Then Null; ??
  18. ????????????when OTHERS Then??
  19. ???????????????? dbms_output.put_line(sqlerrm); ??
  20. ????????end; ??
  21. ????end loop; ??
  22. end;??
create or replace procedure compile_invalid_procedures(p_owner varchar2 -- 所有者名称,即 SCHEMA) as--编译某个用户下的无效存储过程str_sql varchar2(200);beginfor invalid_procedures in (select object_name from all_objectswhere status = 'INVALID' and object_type = 'PROCEDURE' and owner=upper(p_owner))loopstr_sql := 'alter procedure ' ||invalid_procedures.object_name || ' compile';beginexecute immediate str_sql;exception--When Others Then Null;when OTHERS Thendbms_output.put_line(sqlerrm);end;end loop;end;
在 SQL *Plus 中执行该存储过程时,如果要看到 dbms_output.put_line(sqlerrm); 的输出,需要执行 set serverout on 打开输出。

参考:1. 为什么我的存储过程总要重新编译?
??????? 2. 在Oracle中重新编译所有无效的存储过程


[版权声明]本站内文章,如未标注 [转载],均系原创或翻译之作,本人 Unmi 保留一切权利。本站原创及译作未经本人许可,不得用于商业用途及传统媒体。网络媒体可随意转载,或以此为基础进行演译,但务必以链接形式注明原始出处和作者信息,否则属于侵权行为。另对本站转载他处文章,俱有说明,如有侵权请联系本人,本人将会在第一时间删除侵权文章。及此说明,重之之重。

相关推荐

    一键编译指定Oracle用户的所有无效对象

    包含了查找所有Oracle用户的无效对象(包体,视图,存储过程,函数,别名等)的sql语句,以及编译指定用户的无效对象的sql语句。 适用于数据库迁移的时候,出现大量无效对象时,可以一键编译。

    oracle的几个常用命令

    将所有引用表TSYSCOREDEPT 的其他表外键失效 在Oracle中重编译所有无效的存储过程 在Oracle中重编译所有无效的视图 查询死锁现象的会话SID

    青云oracle工具

    7.oracle 有个特点,就是如果表结构发生变化,就会有很多视图,存储过程,触发器等跟着失效,这时候要把这些无效的对象重新编译一下。但是这个动作会经常遗忘, 所以我这里加了一个检索并修正无效对象的功能; 8....

    Oracle数据库管理员技术指南

    2.2.2 怎样重新编译无效对象 2.2.3 在不同表空间之间移动索引 2.2.4 怎样查找最高点 2.2.5 怎样释放未用空间 2.3 DBMS_SPACE 程序包 2.3.1 使用 DBMS_SPACE.UNUSED _SPACE 2.3.2 使用 DBMS_SPACE.FREE _...

    OracleDbTools.rar 青云oracle超人性化工具

    7.oracle 有个特点,就是如果表结构发生变化,就会有很多视图,存储过程,触发器等跟着失效,这时候要把这些无效的对象重新编译一下。但是这个动作会经常遗忘, 所以我这里加了一个检索并修正无效对象的功能;

    Oracle 工具

    7.oracle 有个特点,就是如果表结构发生变化,就会有很多视图,存储过程,触发器等跟着失效,这时候要把这些无效的对象重新编译一下。但是这个动作会经常遗忘, 所以这里加了一个检索并修正无效对象的功能;...

    Oracle绿色版免安装数据库客户端管理工具

    这个也是该软件最大亮点.7.oracle 有个特点,就是如果表结构发生变化,就会有很多视图,存储过程,触发器等跟着失效,这时候要把这些无效的对象重新编译一下.但是这个动作会经常遗忘,所以我这里加了一个检索并修正无效...

    ORACLE9i_优化设计与系统调整

    第一部分 ORACLE系统优化基本知识 23 第1章 ORACLE结构回顾 23 §1.1 Oracle数据库结构 23 §1.1.1 Oracle数据字典 23 §1.1.2 表空间与数据文件 24 §1.1.3 Oracle实例(Instance) 24 §1.2 Oracle文件 26 §1.2.1...

    Object Browser7.0中文版(ORACLE数据库的开发工具)

    比如说[想把最近一周内有所变化的数据库对象全部输出到SQL脚本][把处于无效状态的程序进行再编译]等这种用本来写好的SQL角本可以做成的工作,也会因数据库对象的增加而变得很繁琐.对于这一点来说,Object Browser...

    Oracle8i_9i数据库基础

    §17.7.2 包中无效对象的查询和编译 294 §17.7.3 包源代码的导出 296 第十八章 触发器 297 §18.1 触发器类型 297 §18.1.1 DML触发器 297 §18.1.2 替代触发器 298 §18.1.3 系统触发器 298 §18.2 创建触发器 298...

    Oraclet中的触发器

    触发器的概念 触发器是许多关系数据库系统都提供的一项技术。在ORACLE系统里,触发器... 重新编译触发器 如果在触发器内调用其它函数或过程,当这些函数或过程被删除或修改后,触发器的状态将被标识为无效。当DML...

    OracleDbTools

    7.oracle 有个特点,就是如果表结构发生变化,就会有很多视图,存储过程,触发器等跟着失效,这时候要把这些无效的对象重新编译一下。但是这个动作会经常遗忘, 所以我这里加了一个检索并修正无效对象的功能; 8....

    ob9数据库查看工具中文版.rar

    追求批处理的简洁化比方说,[输出一周前有变更的数据库对象到脚本里][重编译已经无效的程序]等等,当初,即使通过执行SQL命令和脚本就可以对应的事情,随着数据库对象的不断增加,处理变得越来越繁琐。在这一点上,...

    数据库基础

    §17.7.2 包中无效对象的查询和编译 294 §17.7.3 包源代码的导出 296 第十八章 触发器 297 §18.1 触发器类型 297 §18.1.1 DML触发器 297 §18.1.2 替代触发器 298 §18.1.3 系统触发器 298 §18.2 创建触发器 298...

    PLSQL Developer用户指南

    17.3 编译无效对象 ....152 17.4 导出表 ..........153 17.5 导入表 ..........156 17.6 导出用户对象 ....158 17.7 文本导入器 ......159 17.8 ODBC 导入器 .....163 17.9 数据生成器 ......165 17.10 比较用户对象...

    网管教程 从入门到精通软件篇.txt

    如果在本次会话期间磁盘配置发生变化,为获得更新的扫描,必须先重新启动计算机,然后再次扫描磁盘。  bootcfg /list 列出引导列表中已有的条目。  bootcfg /disableredirect 在启动引导程序中禁用重定向。  ...

    精髓Oralcle讲课笔记

    -- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unlock; --那么这个用户名就能使用了。 --(默认全局数据库名orcl) 1、...

    VC++6.0核心编程源码.rar

    如果你传递了一个无效参数,或者由于某种原因它无法执行这项操作,那么该函数就会返回一个值,指明该函数在某种程度上运行失败了。表1-1列出了大多数Windows函数使用的数据类型的返回值。 表1-1 Windows函数常用的...

Global site tag (gtag.js) - Google Analytics