Plsql PL/SQL包开始/结束块之间的代码何时执行?
我的PL/SQL代码类似于以下代码段:Plsql PL/SQL包开始/结束块之间的代码何时执行?,plsql,oracle10g,Plsql,Oracle10g,我的PL/SQL代码类似于以下代码段: create or replace package body MY_PACKAGE as type array_type is table of char index by varchar2(1); lookup_array array_type; function DO_SOMETHING(input nvarchar2) return varchar2 as begin -- Do somet
create or replace
package body MY_PACKAGE as
type array_type is table of char index by varchar2(1);
lookup_array array_type;
function DO_SOMETHING(input nvarchar2)
return varchar2 as
begin
-- Do something here with lookup_array
end DO_SOMETHING;
procedure init_array as
begin
lookup_array('A') := 'a';
lookup_array('B') := 'b';
-- etc
end init_array;
begin
init_array;
end MY_PACKAGE;
它使用一个静态查找数组来处理提供的数据。我的问题是,何时调用init_数组并将lookup_数组加载到内存中?什么时候编译包?第一次是什么时候?它不止叫过一次吗?有没有更好的方法来实现静态查找数组
谢谢 您可以参考此链接: “这意味着该过程在包初始化期间执行。因此,在会话的生存期内,除非需要刷新缓存表,否则不会手动调用该过程。”Q1。“何时调用
init\u array
并将lookup\u array
加载到内存中?何时编译包?何时第一次调用?是否多次调用?”
当调用包中的任何函数或过程时,即“准时”调用init_数组。只要包状态丢失,就会调用它(即,每个会话可以调用多次)
这对包状态丢失的场景有影响-例如,当有人重新编译包时。在此场景中,发生以下顺序:
do\u something
-init\u array
首先被调用,然后执行do\u something
执行-您的会话现在在其PGA中分配了一些内存来保存数组do_something
-Oracle检测到您的会话内存被标记为无效,并发出ORA-04061“xxx的现有状态已无效”do\u something
,它将毫无错误地继续执行-它首先调用init\u array
,然后执行do\u something
在某些情况下,我看到人们将init调用放在每个需要数组的函数/过程的开头,即每当调用
do\u something
时,它都会检查是否需要初始化,如果需要初始化,则会调用init\u数组
。这种方法的优点是,您可以自定义init_数组
,只初始化该函数/过程所需的位-如果init_数组
做了大量工作,这可能是有利的-这可能有助于避免每个会话的一次性启动开销。这不会编译-您已经得到了包裹,但不是spcYeah,我知道;它也不会编译,因为DO_SOMETHING函数为空。这只是一个小片段,让大家知道我在努力做什么。一个有效的例子是少一些分心。少一些对讨论没有帮助的评论也会少一些分心。太好了。正是我想要的。谢谢