`

[转载]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存储过程编译

    在上面的代码中,我们定义了一个名为 `reCompile` 的存储过程,该过程用于重新编译无效的数据库对象。该过程使用游标 `cur_invalid_objects` 来检索无效的数据库对象,并使用 `dbms_ddl.alter_compile` 过程来重新...

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

    在Oracle数据库管理中,"一键编译指定Oracle用户的所有无效对象"是一个常见的需求,尤其是在数据库迁移或升级过程中。无效对象通常是指由于依赖关系断裂、源代码丢失或与新环境不兼容等原因导致无法正常运行的对象,...

    oracle 视图,函数,过程,触发器自动编译脚本

    由于Oracle中的视图、函数(Function)、存储过程(Procedure)等对象之间存在着复杂的依赖关系,因此当某个对象被修改后,可能会导致与其相关的其他对象变得无效(Invalid)。在实际操作中,虽然我们会关注所修改的...

    Oracle无效的数据库对象

    Oracle 总是会尝试自动重编译无效的 PL/SQL 对象和视图,但是可能不会成功。下面将详细介绍如何标识和修正无效的数据库对象。 标识无效的对象 ----------------- 为了标识数据库中的所有无效的对象,我们可以作为...

    Oracle存储过程

    - 查询:查看无效存储过程`SELECT object_name FROM USER_OBJECTS WHERE STATUS='INVALID' AND OBJECT_TYPE='PROCEDURE';`,查看存储过程源代码`SELECT TEXT FROM USER_SOURCE WHERE NAME='procedure_name';` **...

    oracle 增加,删除,修改和分页存储过程

    在Oracle数据库系统中,存储过程是预编译的SQL语句和PL/SQL代码块,它们可以被组织在一起,以实现特定的业务逻辑或数据库操作。在这个“Oracle增加、删除、修改和分页存储过程”项目中,我们将深入探讨这四个核心的...

    oracle资源有关于oracle10存储过程

    Oracle 10g 存储过程是数据库管理系统中一种重要的编程元素,主要用于封装一系列的数据库操作,提升系统性能,确保数据安全。以下是关于存储过程的详细说明: 1. **为什么要使用存储过程**: - 预编译与优化:存储...

    oracle存储过程学习经典[语法+实例+调用]

    **存储过程**是在数据库中预先定义并编译好的一系列SQL语句或PL/SQL代码块,它可以接受输入参数,输出参数,并能实现复杂的业务逻辑处理。通过存储过程,可以有效地提高应用程序的性能、安全性和可维护性。 #### 二...

    oracle存储过程.pptx

    3. 查询:查看无效存储过程`SELECT object_name FROM USER_OBJECTS WHERE STATUS='INVALID' AND OBJECT_TYPE='PROCEDURE'`,查看存储过程源代码`SELECT TEXT FROM USER_SOURCE WHERE`等。 此外,存储过程中还可以...

    OracleSQL、函数、存储过程、错误消息帮助手册CHM格式.zip

    Oracle SQL是一种强大的数据库查询...这个资源对于学习和提高Oracle SQL技能,理解函数和存储过程的工作原理,以及解决数据库操作中的问题非常有帮助。通过深入研究和实践,你可以更好地掌握Oracle数据库的管理和开发。

    oracle的几个常用命令

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

    java调用存储过程(含out参数)

    存储过程是预编译的SQL语句集合,存储在数据库服务器中,可以接受输入参数、输出参数,甚至同时具有两者。`OUT`参数是存储过程中的一种特殊参数类型,用于将结果传出存储过程,供调用者使用。 Java中调用存储过程...

    ORACLE过程和函数

    Oracle过程和函数是数据库管理中重要的编程元素,主要用于实现复杂的数据操作和逻辑处理。它们都是PL/SQL(Oracle的数据库编程语言)的一部分,允许开发者在数据库级别定义和执行功能。 **存储过程** 是一系列预...

    从一个“普通”的Oracle DBA(Oracle数据库管理员)转变为Oracle Applications DBA(Oracle应用程序数据库管理员)

    6. 处理无效对象:定期检查并使用utlrp重新编译无效对象。 7. 日志分析:理解并能解读日志信息,用于故障排查。 8. 环境理解:深入掌握Apps database的环境,包括操作系统和数据库层面。 Oracle Applications的架构...

    青云oracle工具

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

    ORACLE异常处理剖析.pdf

    Oracle异常处理是数据库管理和应用程序开发中的关键环节,它涉及到对程序执行过程中可能出现的错误和异常情况进行有效管理和响应。Oracle数据库,作为一款广泛使用的商业关系型数据库管理系统,提供了强大的异常处理...

    Oracle数据库日常维护手册.pdf

    - **注意事项**: 需要确保所有必要的Oracle服务进程都在运行中,如`oracle`进程等。 - **计数命令**: `$ ps -ef | grep ora_ | grep -v grep | wc -l` - **输出示例**: `oracle 2960 10 May 07` - **解释**: 这里...

    数据库oracle9i 32位升级到oracle10g 64位操作方式

    - 在完成数据迁移后,可能会出现一些无效的对象(如存储过程、函数等),这些对象需要通过重新编译来修复。 - 可以通过执行以下命令来查看无效对象: ```sql SQL> select object_name from dba_objects where ...

    oracle 学习笔记

    Oracle 存储过程是数据库管理中的重要组成部分,它允许开发者编写复杂的PL/SQL代码来执行一系列数据库操作。本文主要探讨了存储过程的概念、优势、定义、维护方法以及相关的数据处理和异常处理策略。 首先,存储...

    Oracle proc

    Oracle预编译程序(Pro*C/C++)是一种工具,它允许开发者将SQL语句直接嵌入到C/C++源代码中,从而实现数据库操作。预编译器会将这些嵌入式的SQL语句转换成可以直接由Oracle数据库服务器解释的格式,这样就可以直接...

Global site tag (gtag.js) - Google Analytics