在程序包启动时自动执行代码

Tau*_*s22 1 oracle plsql packages

我有一个考试,并有一个规格,我不知道这意味着什么.请给我一个提示或给我一个简短的例子.

规范:自动执行包启动时的代码:

满足条件:编写的代码自动初始化变量而无需用户显式调用.

我不确定这是否被问到,但是我必须像这样调用包:PACKAGE_NAME.function_name所以没有值的调用?那是什么问题?

如果是这样,你不需要进一步帮助我,因为我知道该怎么做.

Ale*_*ole 6

您可以在程序包正文中包含不属于任何私有或公共函数或过程的代码; 当每个会话实例化包时执行该代码.

作为一个人为的例子,您可能希望使用初始化时间填充变量,您可以使用:

create package p42 as
  procedure some_proc;
end p42;
/

create package body p42 as
  init_time timestamp;

  procedure some_proc is
  begin
    -- do something
    null;
  end some_proc;

-- run on package instantiation
begin
    init_time := systimestamp;
    -- just as a demo
    dbms_output.put_line('init_time is ' || init_time);
end p42;
/
Run Code Online (Sandbox Code Playgroud)

在为每个会话实例化包时,即当该会话调用第一个过程或函数时,而不是在编译它时,运行最后一个块:

Package body P42 compiled

set serveroutput on
exec p42.some_proc;

PL/SQL procedure successfully completed.
init_time is 19-MAY-15 15.41.29.179387
Run Code Online (Sandbox Code Playgroud)

...而不是从同一会话调用其他过程时:

exec p42.some_proc;

PL/SQL procedure successfully completed.
Run Code Online (Sandbox Code Playgroud)

然后可以在稍后引用该变量.当然,拥有该变量意味着您现在拥有包状态,这会导致其自身的问题.但你可以在初始化期间调用其他程序.

阅读文档中的更多内容; 关于实例化,状态包体的初始化部分:

最后,正文可以有一个初始化部分,其语句初始化公共变量并执行其他一次性设置步骤.初始化部分仅在第一次引用包时运行.初始化部分可以包括异常处理程序.