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

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

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

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

  1. spool ExecCompProc.sql
  2. select 'alter procedure '||object_name||' compile;' from all_objects
  3. where status = 'INVALID' and object_type = 'PROCEDURE' AND owner='UNMI';
  4. spool off
  5. @ExecCompProc.sql;

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

  1. create or replace procedure compile_invalid_procedures(
  2. p_owner varchar2 -- 所有者名称,即 SCHEMA
  3. ) as
  4. --编译某个用户下的无效存储过程
  5. str_sql varchar2(200);
  6. begin
  7. for invalid_procedures in (select object_name from all_objects
  8. where status = 'INVALID' and object_type = 'PROCEDURE' and owner=upper(p_owner))
  9. loop
  10. str_sql := 'alter procedure ' ||invalid_procedures.object_name || ' compile';
  11. begin
  12. execute immediate str_sql;
  13. exception
  14. --When Others Then Null;
  15. when OTHERS Then
  16. dbms_output.put_line(sqlerrm);
  17. end;
  18. end loop;
  19. end;

create or replace procedure compile_invalid_procedures( p_owner varchar2 -- 所有者名称,即 SCHEMA ) as --编译某个用户下的无效存储过程 str_sql varchar2(200); begin for invalid_procedures in (select object_name from all_objects where status = 'INVALID' and object_type = 'PROCEDURE' and owner=upper(p_owner)) loop str_sql := 'alter procedure ' ||invalid_procedures.object_name || ' compile'; begin execute immediate str_sql; exception --When Others Then Null; when OTHERS Then dbms_output.put_line(sqlerrm); end; end loop; end;
在 SQL *Plus 中执行该存储过程时,如果要看到 dbms_output.put_line(sqlerrm); 的输出,需要执行 set serverout on 打开输出。

这里述及的是如何重新编译存储过程,依次推及到,重新编译 FUNCTION、PACKAGE、TYPE、TRIGGER 等,和重建 INDEX 等。所不同的就是查询 all_objects 时的  object_type 不一样,还有要执行的 alter 语句不一样。

object_type 有哪些可用 select distinct object_type from all_objects 获取到;alter 的语句写法参考下面:

  1. alter function function_name compile;
  2. alter package package)name compile;
  3. alter type type_name compile;
  4. alter index index_name rebuild;
  5. --等等............

alter function function_name compile; alter package package)name compile; alter type type_name compile; alter index index_name rebuild; --等等............

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


补充,请看这里:

1. 其实存储过程、函数等是 INVALID,只要内容无错误就不要紧,因为执行的时候会自动重新编译
2. 在 SQL *Plus 或者 PL/SQL Developer 的 Command Windows 中用 show  errors  procedure  procedure_name 或 show errors function function_name 可以查看到存储过程具体错误
3. 可以用 Oracle 提供的工具:dbms_utility.compile_schema(schema varchar2, compile_all boolean default TRUE); 来编译某个 Schema 下的所有 PROCEDURE、FUNCTION、PACKAGE 和 TRIGGER。比如执行 dbms_utility.compile_schema('Unmi')。

转载于:https://www.cnblogs.com/lingxzg/archive/2009/03/09/1406967.html

Oracle 中重新编译无效的存储过程, 或函数、触发器等对象(转)相关推荐

  1. Oracle数据库中调用Java类开发存储过程、函数的方法

    Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日  浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...

  2. Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器

    ---视图 ---视图的概念:视图就是提供一个查询的窗口,来操作数据库中的数据,不存储数据,数据在表中. ---一个由查询语句定义的虚拟表.---查询语句创建表 create table emp as ...

  3. WebDay18 MySQL存储过程 存储函数 触发器 事务

    MySQL存储过程 存储函数 触发器 事务 一.MySQL存储过程和函数 1.存储过程和函数的概念 2.存储过程和函数的好处 3.存储过程和函数的区别 4.创建存储过程 5.调用存储过程 6.查看存储 ...

  4. MySQL表/视图/存储过程and函数/触发器/事件与数据库之间的关系

    mysql中的数据库包含表.视图.存储过程and函数.触发器.以及事件. 数据库: 数据库是存放数据的仓库.数据库中的数据不是直接存在数据库中,而是存在数据库的表中 表(table): 表是数据库中存 ...

  5. oracle中blob转换,BLOB转换为CLOB的函数(oracle中执行)

    BLOB转换为CLOB的函数(oracle中执行) CREATE OR REPLACE FUNCTION BlobToClob(blob_in IN BLOB) RETURN CLOB AS v_cl ...

  6. oracle函数 授权,如何在Oracle中以普通用户身份运行dbms_crypto函数?

    我在Oracle中使用dbms_crypto.hash()函数时遇到问题. 我使用sqlplus作为"sys / passwd as sysdba"连接到数据库服务器, 然后我安装 ...

  7. 如何获取Oracle数据库中某表及索引、约束、触发器、对象权限的创

    2019独角兽企业重金招聘Python工程师标准>>> 对于数据库中特定的某张表而言,又该如何获取建表语句.及索引.约束.外键约束.触发器.对象权限的创建脚本呢? OCM11g-&g ...

  8. mysql高级知识(linux安装mysql+索引+视图+存储过程和函数+触发器)

    一.linux系统安装Mysql 1.mysql安装包: MySQL :: Download MySQL Community Server 2.mysql安装 linux安装在vmware(虚拟机)上 ...

  9. 在Oracle中重编译所有无效的存储过程

    SQL_PLUS中 spool ExecCompProc.sql select 'alter procedure '||object_name||' compile;' From all_object ...

最新文章

  1. GDI+ Bitmap与WPF BitmapImage的相互转换
  2. UpSetR:多数据集绘图可视化处理利器
  3. 视频编码名词参数解释——非常全面详细
  4. MATLAB reshape()函数和sub2ind()函数
  5. C++类的定义和声明
  6. 2018/3/1 省选模拟考试 50分
  7. Linux find命令、Linux rmdir命令、Linux ls命令
  8. jQuery多选列表框插件Multiselect
  9. 转:Java NIO系列教程(二) Channel
  10. Xcode可删除文件列表
  11. python查看mongo库容量_mongo查看数据库空间大小
  12. [国嵌攻略][068][tftp网络协议实现]
  13. 2019,数据库行业迎50年第二次巨变
  14. 计算机桌面文件如何发送给qq好友,桌面文件如何发到qq
  15. CentOS向日葵安装
  16. 2)MFC对话框程序设计
  17. linux使用grep查找文件内容,linux如何使用grep命令查找文件内容
  18. 磁力搜索 v2.3.5.0 for Android 免费无广告版
  19. STM32 DCMI OV9655 直接在LCD显示
  20. win10的系统mysql服务器地址,win10注册mysql服务器地址

热门文章

  1. ubuntu下无法在目录下创建文件夹,权限不足解决办法
  2. Vue利用Vue.extend()实现自定义弹出框
  3. ASP.NET Core 基础知识(十四)错误处理
  4. Python Revisited Day 07 (文件处理)
  5. php之自动加载(懒加载)
  6. SGU 275. To xor or not to xor
  7. hp designiet 500绘图仪程序_邹军:通过数控宏程序实现刀具寿命管理
  8. C语言题目集-分西瓜
  9. html 重复提交表单,表单重复提交问题的三种解决思路
  10. android版本相机权限,Android 11系统权限收紧,第三方APP仅支持调用原生相机