在重新编译oracle包时,哪些缓存会更新?

问题描述 投票:0回答:2

我正在使用Oracle PL-SQL包。有一个流程在执行时似乎有问题,我试图弄明白。我做了一些数据修正,但问题仍然存在。所以我添加了痕迹并再次执行了流程,并且在那里工作得很好!

由于重新编译包,似乎问题得到解决。那可能吗?如果是这样,会发生什么?

database oracle plsql package oracle12c
2个回答
2
投票

有几种可能性。

更有可能的是,您的包将一些数据存储在局部变量(如PL / SQL集合)中。这将忽略基础源表中的数据更改,除非您有适当的过程来触发重新填充。编译程序包会消除会话状态,因此您在运行程序时会看到新数据。

对此的变化是将数据存储在事务级别设置的全局临时表中。同样,重新创建包将发出一个提交,这将导致GTT丢弃数据。

另一种可能性是您的过程在READ ONLY事务中运行。所以它只在会话开始时才看到数据的状态。同样,重新编译包会破坏它。


如果这些解释都不适用于您的情况,则需要提供有关存储过程正在执行的操作的更多详细信息。


1
投票

包是子程序的集合。当第一次调用子程序时,整个包将加载到共享池的库高速缓存中。解析它,然后执行代码。对于任何后续调用,重用已解析的代码以避免硬解析。在第一次调用代码时,我们得到了库缓存未命中。后续调用会获得库缓存命中。

如果包依赖的任何对象通过DDL进行结构更改,则库高速缓存中的解析代码将失效,并在下次调用时重新加载。我曾经在Oracle 9i的嵌套过程中面对这个问题。在12c没有面对这个。

如果您有兴趣了解Oracle内存结构,那么OracleDocumentation是最好的起点。

© www.soinside.com 2019 - 2024. All rights reserved.