在包启动时自动执行代码

Automatically execute code on package startup

我即将参加考试,并且有一个规范,但我不确定它是什么意思。能否给我一些提示或给我一个简短的例子。

Specification: Automatically execute code on package Startup:

If criteria met: Code written that automatically initialises variable without explicit call from user.

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

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

您可以在包体中包含不属于任何私有或 public 函数或过程的代码;该代码在每个会话实例化包时执行。

作为一个人为的例子,您可能想用初始化时间填充一个变量,您可以这样做:

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;
/

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

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

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

exec p42.some_proc;

PL/SQL procedure successfully completed.

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

在文档中阅读更多内容; about instantiation, state, and the initialisation part of the package body:

Finally, the body can have an initialization part, whose statements initialize public variables and do other one-time setup steps. The initialization part runs only the first time the package is referenced. The initialization part can include an exception handler.

你可以这样做:

CREATE OR REPLACE PACKAGE MY_PACKAGE AS

FUNCTION GiveMeFive RETURN NUMBER;

END MY_PACKAGE;
/

CREATE OR REPLACE PACKAGE BODY MY_PACKAGE IS

    five NUMBER;

FUNCTION GiveMeFive RETURN NUMBER IS
BEGIN
    RETURN five;
END GiveMeFive;

-- By this syntax the procedure is running once when this package is executed first time within a session 
BEGIN
    five := 5;
END;

/

注意,包体必须按/关闭,不要使用

BEGIN
   five := 5;
END;

END MY_PACKAGE;
/