不久前在市检的生产环境上有个存储过程执行报错,错误信息如下:

ORA-04068: 已丢弃程序包  的当前状态
ORA-04061: package "ZHANGXSH.PR_TEST" 的当前状态失效
ORA-04065: 未执行, 已更改或删除 package "ZHANGXSH.PR_TEST"
ORA-06508: PL/SQL: 无法找到正在调用 : "ZHANGXSH.PR_TEST" 的程序单元
ORA-06512: 在 line 2

当然这个错误信息是我在我本机试验复现的,不是真实的报错信息,不过都是一样的

开始怀疑是存储过程编译失败造成,但是经过仔细排查,发现没有编译失败,该包所依赖的其他过程、函数、视图等都没有问题。仔细分析了下,发现该包里面有多个全局变量,怀疑是全局变量的问题,于是我在本机做了个测试,将该问题复现了下:
首先在会话1中创建以下包:

CREATE OR REPLACE PACKAGE PKG_TEST AS
LDLX NUMBER := 1000;
END PKG_TEST;
/ CREATE OR REPLACE PACKAGE BODY PKG_TEST AS
END PKG_TEST;
/

然后创建测试的存储过程:

create or replace procedure pr_test2 as
begin
PKG_TEST.LDLX := PKG_TEST.LDLX+110;
dbms_output.put_line(PKG_TEST.LDLX);
end;
/
然后在会话2中执行pr_test2;
SQL> set serveroutput on
SQL> exec pr_test2; 1110 PL/SQL procedure successfully completed

可以成功执行。
然后回到会话1中重新编译PKG_TEST 包。再回到会话2执行存储过程:

SQL> /

begin pr_test2; end;

ORA-04068: 已丢弃程序包  的当前状态
ORA-04061: package "ZHANGXSH.PKG_TEST" 的当前状态失效
ORA-04065: 未执行, 已更改或删除 package "ZHANGXSH.PKG_TEST"
ORA-06508: PL/SQL: 无法找到正在调用 : "ZHANGXSH.PKG_TEST" 的程序单元
ORA-06512: 在 "ZHANGXSH.PR_TEST2", line 3
ORA-06512: 在 line 2 SQL>

此时,该错误立刻被抛出,原因就是全局变量在会话2中存在一个拷贝,当会话不关闭时,该拷贝会一直存在于pga中,如果该包在此时被重新编译会导致该拷贝失效而报错。在实际测试中发现,该错误出现的概率约为60%左右,也就是说重新编译100次,约会出现60次,而且诡异的是在rh5+10G下面居然不出现该错误,只有当全局变量的值改变时才报该错。原因有待进一步研究。
因此,很多人包括我自己都偏爱存储过程,原因之一就是修改后无需重启中间件立刻生效,这个案例说明,存储过程也是可能发生问题的,因此提供以下避免的方法:

1.全局变量不要和相关的函数、存储过程定义在一个包里面,而是单独定义,单独定义的目的是减少被重新编译的概率。
2.不要使用全局变量,如果要使用,则参考1.

如果已经发生了该错误,解决办法如下:

1.将运行报错的会话kill掉。
2.刷新共享区:alter system flush shared_pool;

【原创】ORA-04068: 已丢弃程序包 的当前状态研究的更多相关文章

  1. Oracle编程入门经典 第11章 过程、函数和程序包

    目录 11.1          优势和利益... 1 11.2          过程... 1 11.2.1       语法... 2 11.2.2       建立或者替换... 2 11.2 ...

  2. Linux:Day10 程序包管理

    YUM:yellow dog,Yellowdog Update Modifier yum repository:yum repo 存储了众多rpm包,以及包的相关的无数据文件(放置于特定目录下:rep ...

  3. Linux 程序包管理-RPM

    程序简介:  POSIX(Portable Openratin System)跨平台系统:不同操作系统平台的标准C库(glibc)都是遵循POSIX规范的,这样基于标准库开发程序的源代码可以夸平台编译 ...

  4. VS 中NuGet 尝试还原程序包时出错"*"已拥有为"**"定义的依赖项

    之前从Git检出项目以后,项目编译不能通过,发现是缺少依赖的外部插件,于是通过NuGet去获取项目依赖的插件,如何通过NuGet恢复使用的插件请使用NuGet还原项目插件. 但是就是在使用NuGet还 ...

  5. 【原创】NuGet 出现“无法初始化 PowerShell 主机,如果将你的 PowerShell 执行策略设置设置为 AllSigned ,请先打开程序包管理控制台以初始化该主机” 错误的解决方法

    现象: 网上的设置 AllSigned 等方法都无效..后来考虑可能跟命令行版本兼容性有关系,然后在注册表命令行配置里发现一 ForceV2 设置项,抱着试一试的心态改了下,果然解决了! 解决方法:修 ...

  6. VS2013中Nuget程序包管理器控制台使用入门(三)-项目实战(原创)

    VS2013中Nuget程序包管理器控制台使用入门(三)-项目实战 1.给指定项目安装Newtonsoft.Json ,Version 4.5.11 PM> Install-Package Ne ...

  7. VS2013中Nuget程序包管理器控制台使用入门(二)-如何使用Nuget提供的帮助(原创)

    如何使用Nuget提供的帮助? 1.从get-help Nuget开始,键入“get-help NuGet”以查看所有可用的 NuGet 命令. 用法: PM> get-help Nuget 主 ...

  8. VS2013中Nuget程序包管理器控制台使用入门(一)-准备环境(原创)

    准备环境: 1.打开VS2013IDE集成开发环境. 2.新建一个Asp.net Mvc的项目,比如命名为:MvcApplication1 3.打开 菜单"工具"->&quo ...

  9. idea在maven中引入了jar包依赖,但是编译过程中报出XXX程序包不存在,已解决

    idea在maven中引入了jar包依赖,但是编译过程中报出XXX程序包不存在 1. 报错具体情况 2. Project Structure中的Libraries没有任何红色波浪线 3. 发现自己要引 ...

随机推荐

  1. 怎样解决VirtrualBox不能新建64bit的系统的问题

    假设你的VirtrualBox不能新建64bit的虚拟机一般有以下两个原因: 1.电脑是32位的,不支持创建64bit的虚拟机 2.电脑不支持Intel VT-x,或者是Intel VT-x没有打开 ...

  2. C++ 方法隐藏

    1.过载:一个类中,方法名相同,形参表不同的方法. 2.重写:子类与父类的virtual方法,方法名,形参表相同. 3.考虑下面的情况,子类与父类方法名相同. 父类是virtual方法         ...

  3. java建立二叉树,递归/非递归先序遍历,递归/非递归中序遍历,层次遍历

    import java.util.LinkedList; import java.util.Scanner; import java.util.Stack; //structure of binary ...

  4. [Angular 2] Share a Service Across Angular 2 Components and Modules

    Services are used to share data between components. They follow a module pattern that allows you to ...

  5. Linux下mv命令详解

    mv命令格式:mv [选项] 源文件或目录 目标文件或目录 mv命令参数(选项): -b :若需覆盖文件,则覆盖前先行备份. -f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖: ...

  6. c++ 设计模式7 (Bridge 桥模式)

    4.2 Bridge 桥模式 动机: 由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个变化的维度. 代码示例: 实现一个Messager,含有基本功能PlaySound,Connec ...

  7. spark HA

    spark HA 的两种实现: 基于文件系统的单点恢复(Single-Node Recovery with Local File System) 基于zookeeper的Standby Masters ...

  8. .net中的多线程

    一.多线程的概念        什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的,线程是程序中的一个执行流, ...

  9. cigarettes

    描述 Tom has many cigarettes. We hypothesized that he has n cigarettes and smokes them one by one keep ...

  10. iOS -动态可变参数

    #import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...