EBS系统<关于Oracle数据库的包的编译(对AP程序的)影响>

个人经验的总结,希望给一些开发人员有帮助:
1 Form直接调用对应的Pkg,当该Pkg被修改之后(无论是包头还是包主体被修改),第一次查询Form会报错。第二次做就OK。
需要注意的是,这时候,Form就无法获取环境变量等信息。例如FND_GLOBAL.USER_ID就返回-1。除非用户关掉Form再重新打开!
错误样例:
ORA-04068: 已丢弃程序包  的当前状态
ORA-04061: package body "APPS.XYG_PUB_COMMON_PKG" 的当前状态失效
ORA-04065: 未执行, 已变更或删除 package body "APPS.XYG_PUB_COMMON_PKG"
ORA-06508: PL/SQL: 无法找到正在调用 : "APPS.XYG_PUB_COMMON_PKG" 的程序单元
ORA-06512: 在 line 1


2 这个包(Form直接调用的Pkg)相关的 调用的包(就是间接调用的对象)修改之后,好像是对Form是没影响的。

简而言之,对于Form来说,只有直接调用的Pkg的修改才会有影响,间接调用的应该是没影响的。至少测试是这个结果!
从Pkg的角度出发说明:假设Pkg1被修改了,Pkg2调用了Pkg1;测试的结果是:Pkg1的正常的修改并不会影响Pkg2!Pkg2的最后修改时间和状态等的信息都是不变的。


3 有一种情况是必须要注意的。

当包是无效的状态(被修改为无效状态),则和它相关的所有的对象都会自动被修改为无效!这个貌似也是Oracle的自动化处理。
所以,如果是这种情况,就算你随后立刻修正了这个包,但是,和它相关的所有的包(调用它的)都是那种"被修改过"的效果!
这种情况的话,就算Form没直接调用这个包,但是也会报错。
ORA-04068: 已丢弃程序包  的当前状态
ORA-04061: package "APPS.XYG_PUB_COMMON_PKG" 的当前状态失效
ORA-04065: 未执行, 已变更或删除 package "APPS.XYG_PUB_COMMON_PKG"


4 接上第三点,如果一个包的状态被修改为无效,则调用它的所有的对象(包括View,Pkg,Fun等)的状态都自动变为Invalid!

这时候,当你修正这个包之后,其它的相关的对象(相关的对象。。)都要重新编译才行。
所以,这里就提出了一点很重要的要求:包可以修改,但是一定不可以改错!就算你立刻修正了错误,那也可能会导致灾难性的问题。
为什么?因为包和包直接的关系是千丝万缕的。一个包错了,导致第二个包错,然后导致第三个包错。。。
然后,重新编译的时候,正常应该是从第一个引用所有没错误的包开始编译才对;但是,这个很难判断的,所以一般来说都要编译好几次才行。
之前试过一次很严重的情况:标准的销售订单无法使用!
因为标准有一个Pkg不知道被谁给改了,并且被改成无效状态,导致大面积的AP问题。最后被迫要停掉AP应用,然后再重新编译好几百个对象,才可以使用。
另外,包出错,经常会导致环境变量无法获取的问题,烦!
综上所述,Pkg的修改,最好还是严格测试之后才上线,特别是那种比较核心的被N个程序所调用的包。另外,最好选择在线用户数少的时候上线程序。


5 最后补充一点,如果Pkg正在被会话Active调用(例如请求正在运行,或者查询正在运行等),则是无法被修改。包括Pkg调用的另外的Pkg也无法被修改!

(测试确认!)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值