【原创】ORA-04068: 已丢弃程序包 的当前状态研究
不久前在市检的生产环境上有个存储过程执行报错,错误信息如下:
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: 已丢弃程序包 的当前状态研究的更多相关文章
- Oracle编程入门经典 第11章 过程、函数和程序包
目录 11.1 优势和利益... 1 11.2 过程... 1 11.2.1 语法... 2 11.2.2 建立或者替换... 2 11.2 ...
- Linux:Day10 程序包管理
YUM:yellow dog,Yellowdog Update Modifier yum repository:yum repo 存储了众多rpm包,以及包的相关的无数据文件(放置于特定目录下:rep ...
- Linux 程序包管理-RPM
程序简介: POSIX(Portable Openratin System)跨平台系统:不同操作系统平台的标准C库(glibc)都是遵循POSIX规范的,这样基于标准库开发程序的源代码可以夸平台编译 ...
- VS 中NuGet 尝试还原程序包时出错"*"已拥有为"**"定义的依赖项
之前从Git检出项目以后,项目编译不能通过,发现是缺少依赖的外部插件,于是通过NuGet去获取项目依赖的插件,如何通过NuGet恢复使用的插件请使用NuGet还原项目插件. 但是就是在使用NuGet还 ...
- 【原创】NuGet 出现“无法初始化 PowerShell 主机,如果将你的 PowerShell 执行策略设置设置为 AllSigned ,请先打开程序包管理控制台以初始化该主机” 错误的解决方法
现象: 网上的设置 AllSigned 等方法都无效..后来考虑可能跟命令行版本兼容性有关系,然后在注册表命令行配置里发现一 ForceV2 设置项,抱着试一试的心态改了下,果然解决了! 解决方法:修 ...
- VS2013中Nuget程序包管理器控制台使用入门(三)-项目实战(原创)
VS2013中Nuget程序包管理器控制台使用入门(三)-项目实战 1.给指定项目安装Newtonsoft.Json ,Version 4.5.11 PM> Install-Package Ne ...
- VS2013中Nuget程序包管理器控制台使用入门(二)-如何使用Nuget提供的帮助(原创)
如何使用Nuget提供的帮助? 1.从get-help Nuget开始,键入“get-help NuGet”以查看所有可用的 NuGet 命令. 用法: PM> get-help Nuget 主 ...
- VS2013中Nuget程序包管理器控制台使用入门(一)-准备环境(原创)
准备环境: 1.打开VS2013IDE集成开发环境. 2.新建一个Asp.net Mvc的项目,比如命名为:MvcApplication1 3.打开 菜单"工具"->&quo ...
- idea在maven中引入了jar包依赖,但是编译过程中报出XXX程序包不存在,已解决
idea在maven中引入了jar包依赖,但是编译过程中报出XXX程序包不存在 1. 报错具体情况 2. Project Structure中的Libraries没有任何红色波浪线 3. 发现自己要引 ...
随机推荐
- Android Studio开发JNIproject
使用Android Sutdio创建一个新的project后,接下来记录创建NDKproject的基本步骤. 本文将达到: 1. 创建NDKproject 2. 在JNI中输出Log语句 3. 指定编 ...
- corner2
Original: https://github.com/LondonX/corner2 Backup: https://github.com/eltld/corner2
- TP函数
U方法用于完成对URL地址的组装,特点在于可以自动根据当前的URL模式和设置生成对应的URL地址,格式为:U('地址','参数','伪静态','是否跳转','显示域名');在模板中使用U方法而不是固定 ...
- iOS开发——UI篇Swift篇&UISlider
UISlider override func viewDidLoad() { super.viewDidLoad() titleLabel.text = titleString // Do any a ...
- HDU 5019 Revenge of GCD(数学)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5019 Problem Description In mathematics, the greatest ...
- android studio 预览保持,因为是SDK版本过高,可以点击小图标机器人修改SDK版本号。
Exception raised during rendering: com/android/util/PropertiesMap
- linux之history
1.使用HISTTIMEFORMAT在历史中显示TIMESTAMP 通常情况下,当你在命令行中键入history时,终端中将显示你刚输入的命令及其编号.如果出于审查命令的目的,和命令一起显示时间戳将会 ...
- String、Brush、Color 相互转换
1.String转换成Color Color color = (Color)ColorConverter.ConvertFromString(string); 2.String转换成Brush Bru ...
- [书目20131223]Android、iPhone、Windows Phone手机网页及网站设计:最佳实践与设计精粹 - 张亚飞
目录 第I篇 手机版专用网站设计和开发入门篇 第1章 准备创作环境和测试环境 3 1.1 使用Mobile Safari测试网页 4 1.1.1 iOS Simulator安装 5 1.1.2 使用M ...
- Macbook之用brew安装Python
1. brew install python 2.If you don't have ~/.bash_profile, add ~/.bash_profile by touch ~/.bash_pro ...