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数据库管理中的关键知识点,包括但不限于以下几个方面: 1. **存储过程与函数**:存储过程是预编译的SQL语句集合,用于执行特定任务。它们可以提高...
由于Oracle中的视图、函数(Function)、存储过程(Procedure)等对象之间存在着复杂的依赖关系,因此当某个对象被修改后,可能会导致与其相关的其他对象变得无效(Invalid)。在实际操作中,虽然我们会关注所修改的...
总之,Oracle的存储过程、函数和触发器是数据库开发中不可或缺的部分。它们提供了强大的功能,使得开发者可以更好地管理和控制数据库中的数据,实现高效、安全的应用程序。通过深入学习和实践,你可以掌握这些工具,...
根据提供的信息,我们可以深入探讨存储过程、存储函数与触发器的相关知识点。 ### 存储过程 存储过程是一种预编译的SQL代码块,它被存储在数据库中,并且可以通过简单的调用来执行复杂的逻辑操作。存储过程可以...
PLSQL Developer是一种功能强大的Oracle数据库开发工具,提供了许多功能来帮助开发者快速编写和管理存储过程、存储函数和触发器等高级数据库对象。本文将详细介绍如何使用PLSQL Developer编写和管理存储过程、存储...
总之,Oracle PL/SQL中的存储过程、函数和触发器为数据库开发提供了强大的工具,它们使得数据库不仅仅是一个数据存储的地方,更是业务逻辑的执行平台。深入理解和熟练掌握这些概念,对于任何Oracle数据库管理员或...
本套教程全面覆盖了Oracle数据库的核心编程元素,包括存储过程、函数、触发器、异常处理、游标和存储包,这些都是数据库开发和管理中的关键概念。 首先,我们来详细了解存储过程。存储过程是一组预编译的SQL语句,...
### Oracle存储过程、函数、触发器应用举例 #### 一、存储过程 **1.1 存储过程的概念** 存储过程是一种预编译的SQL代码集合,它可以在Oracle数据库服务器上执行复杂的逻辑处理任务。存储过程可以接受输入参数并...
### PL/SQL程序设计——存储过程、函数与触发器 #### 概述 ...总之,存储过程、函数、触发器以及异常管理是PL/SQL编程中不可或缺的核心组成部分,掌握这些技术对于Oracle数据库开发人员来说至关重要。
Oracle数据库中的存储过程是一组预编译的SQL语句和PL/SQL代码,它们被组织在一起以完成特定的任务。存储过程的创建使用`CREATE PROCEDURE`语句,如: ```sql CREATE PROCEDURE procedure_name ( parameter IN data...
在Oracle中,存储过程是预先编译好的SQL语句集合,它可以接受参数、返回结果、包含流程控制和变量声明,类似于其他编程语言中的函数。存储过程的使用有以下几个主要优点: 1. **执行速度快**:由于存储过程在创建时...
Oracle数据库是广泛应用于大型企业级数据管理的一种关系型数据库系统,它支持丰富的数据库技术,包括存储过程、函数、触发器和包等高级特性。这些特性极大地增强了数据库的灵活性和功能,使得开发者能够创建复杂的...
触发器是Oracle数据库中的一种特殊类型的存储过程,它会在特定的数据库事件发生时自动执行,如INSERT、UPDATE或DELETE操作。触发器的主要作用是扩展SQL语句的功能,提供数据完整性、业务规则的强制和审计跟踪等。 1...
在Oracle数据库系统中,存储过程、触发器和定时器是三个关键的数据库管理工具,它们在数据处理和业务逻辑执行中扮演着重要角色。本文将详细介绍这三个概念,并结合实际例子来帮助理解它们的工作原理和应用。 1. **...
然而,为了保护代码安全,Oracle允许开发者对存储过程、函数等PL/SQL对象进行加密。这在某些情况下可能会给维护和协作带来困扰,因为无法直接查看源代码。这时,“Oracle反编译工具”就显得尤为重要。 “Oracle反...
总的来说,实验"存储过程,函数和触发器"旨在让学生理解和掌握数据库中的这两个重要概念。通过实际操作,学生可以深入理解存储过程和触发器在数据管理中的作用,以及如何利用它们来维护数据的完整性和一致性。同时,...
Oracle数据库系统是企业级数据管理的重要工具,其中的触发器(Triggers)、存储过程(Stored Procedures)、函数(Functions)和包(Packages)是其核心的编程元素,用于实现复杂的业务逻辑和数据处理。以下是这些...
在Oracle中,连接查询和子查询以及存储过程与触发器是数据库管理与开发中的核心概念,下面将对这些主题进行深入讲解。 首先,让我们探讨**连接查询**。在数据库操作中,连接查询用于合并两个或更多表的数据,根据...
总的来说,Oracle Job调度存储过程和触发器是数据库管理中不可或缺的工具,它们允许数据库管理员自动化许多常规任务,提高效率,减少人为错误,并确保数据的一致性和准确性。通过灵活地配置和组合这些功能,可以实现...