`
winie
  • 浏览: 216611 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

Oracle 中重新编译无效的存储过程, 或函数、触发器等对象

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

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

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

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

view source
print?
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='UNMI';
5.
6.spool off
7.
8.@ExecCompProc.sql;

2. 写成一个存储过程 -- 让这个存储过程在某个时机执行,比如  Job 中,代码如下:

view source
print?
01.create or replace procedure compile_invalid_procedures(
02.    p_owner varchar2 -- 所有者名称,即 SCHEMA
03.) as
04.
05.--编译某个用户下的无效存储过程
06.
07.    str_sql varchar2(200);
08.    
09.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;

在 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 的语句写法参考下面:

view source
print?
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.--等等............


参考: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')。

参考:1. 为什么我创建的存储过程,存储函数都是无效的?
        2. DBMS_UTILITY
分享到:
评论

相关推荐

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

    日常管理维护一个oracle数据库服务器的时,经常会碰到修改view,table结构的情况,而且由于oracle view,函数,存储过程等对象的相互关联的关系,经常会由于一个view,table,fun,proc的修改而导致相关的对象失效。...

    Oraclet中的触发器

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

    Oracle中命名块之存储过程的详解及使用方法

    如:存储过程、存储函数、包、触发器等、  存储过程:无返回值;  存储函数:有返回值;  包:可容纳多个过程或函数的一个容器(较好管理这些过程和函数,类似于java中的包);  触发器:在合适的实际被自动执行。...

    21天学通Oracle

    8.3.3 调用程序包中的函数/存储过程 157 8.3.4 程序包中的变量 158 8.4 本章实例 159 8.5 本章小结 161 8.6 习题 161 …… 第9章 游标(教学视频:36分钟) 162 第10章 触发器(教学视频:58分钟) 178 第11...

    Oracle_Database10g_性能调整与优化-第10章_使用PLSQL提高性能

    在Oracle中,PL/SQL的源代码可以以过程、函数、数据包,或者触发器的形式被存储在数据库中。一旦这些对象以编译过的格式存储在数据库中,那么用户只要获得相应对象的执行特权就都可以使用任何的Oracle工具来执行这些...

    Oracle SQL Handler(Oracle 开发工具) v5.1.zip

    (10)方便操作常用数据字典如表、视图、索引、过程、函数、触发器等(能查看和编辑编译PL/SQL代码); (11)中英文双语界面并能随时切换,个性化界面设置,界面简洁清爽; (12)运行语句“DESC tableName”清晰...

    Oracle SQL Hand-Oracle工具 v5.1.zip

    (6) 方便操作常用数据字典如表、视图、索引、过程、函数、触发器等(能显示和编辑编译PL/SQL代码); (7) 中英文双语界面并能随时切换,个性化界面设置,界面简洁清爽; (8) 运行语句“DESC tableName”清晰地显示表...

    oracle学习资料

    第一章 PL/SQL 程序设计简介 4 §1.2 SQL与PL/SQL 4 §1.2.1 什么是PL/SQL? 4 ...§8.2.6 重新编译触发器 13 §8.3 删除和使能触发器 13 §8.4 触发器和数据字典 13 §8.5 数据库触发器的应用举例 13

    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...

    精通SQL--结构化查询语言详解

    15.5.2 oracle中存储过程和函数的管理 324 第16章 sql触发器 325 16.1 触发器的基本概念 325 16.1.1 触发器简介 325 16.1.2 触发器执行环境 325 16.2 sql server中的触发器 326 16.2.1 sql server触发器的种类...

    oracle实验报告

    2、 定义一个为修改职工表(emp)中某职工工资的存储过程子程序,职工名作为形参,若该职工名在职工表中查找不到,就在屏幕上提示“查无此人”然后结束子程序的执行;否则若工种为MANAGER的,则工资加$1000;工种为...

    精通Oracle.10g.PLSQL编程

    它不仅具有过程编程语言的基本特征(循环、条件分支等),而且还具有对象编程语言的高级特征(重载、继承等)。 本书是专门为Oracle应用开发人员提供的编程指南。通过学习本书,读者不仅可以掌握PL/SQL的基础编程知识...

    plsql_oracle 编程

    第一章 PL/SQL 程序设计简介 4 §1.2 SQL与PL/SQL 4 §1.2.1 什么是PL/SQL? 4 ...§8.2.6 重新编译触发器 13 §8.3 删除和使能触发器 13 §8.4 触发器和数据字典 13 §8.5 数据库触发器的应用举例 13

    精通sql结构化查询语句

    讲解SQL语言的应用,提供了近500个曲型应用,读者可以随查随用,深入讲解SQL语言的各种查询语句,详细介绍数据库设计及管理,详细讲解存储过程、解发器和游标等知识,讲解了SQL语言在高级语言中的具体应用。...

    plsql_oracle 8i 编程讲义

    第一章 PL/SQL 程序设计简介 4 §1.2 SQL与PL/SQL 4 §1.2.1 什么是PL/SQL? 4 ...§8.2.6 重新编译触发器 13 §8.3 删除和使能触发器 13 §8.4 触发器和数据字典 13 §8.5 数据库触发器的应用举例 13

    精通SQL 结构化查询语言详解

    15.5.2 Oracle中存储过程和函数的管理 第16章 SQL触发器  16.1 触发器的基本概念  16.1.1 触发器简介  16.1.2 触发器执行环境 16.2 SQL Server中的触发器  16.2.1 SQL Server触发器的种类  16.2.2 ...

    Oracle 总结

    Oracle精华,初学者必备,包含一、 数据库查询二、 SQL常用的命令分类及例子三、四、 表连接(关联查询) Oracle数据库函数五、 组函数六、 子查询七、 约束八、 数据字典九、 事务transaction十、 Oracle中的伪列...

    ORACLE9i_优化设计与系统调整

    §12.1.2 调整或使触发器无效 137 §12.1.3 重组数据 137 §12.2 优化目标 137 §12.2.1 优化序列SQL语句 137 §12.2.2 优化并行执行 138 §12.2.3 调整OLTP应用 138 §12.3 实际优化例子 139 §12.3.1 避免基于规则...

    Oracle 10g 开发与管理

    本文是由笔者2012年学习oracle数据库时编写的学习札记,其中的题目 多数为老师留下的思考题目。 我相信本文会对初学者使用oracle有一个初步的使用印象。右图为我所参 考的书籍。 目录 第一讲 Oacle关系数据库 ...

Global site tag (gtag.js) - Google Analytics