Plsql 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

我的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 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

  • Q2。“是否有更好的方法实现静态查找数组?”

    只要考虑到上述行为,我认为这种方法没有任何实际问题


    在某些情况下,我看到人们将init调用放在每个需要数组的函数/过程的开头,即每当调用
    do\u something
    时,它都会检查是否需要初始化,如果需要初始化,则会调用
    init\u数组
    。这种方法的优点是,您可以自定义
    init_数组
    ,只初始化该函数/过程所需的位-如果
    init_数组
    做了大量工作,这可能是有利的-这可能有助于避免每个会话的一次性启动开销。

    这不会编译-您已经得到了包裹,但不是spcYeah,我知道;它也不会编译,因为DO_SOMETHING函数为空。这只是一个小片段,让大家知道我在努力做什么。一个有效的例子是少一些分心。少一些对讨论没有帮助的评论也会少一些分心。太好了。正是我想要的。谢谢