包的初始化部分

Initialization section of the package

这是包装规格:

CREATE OR REPLACE PACKAGE employee_info
IS
  PROCEDURE p;

  FUNCTION f RETURN BOOLEAN;

END employee_info;

这是包体:

CREATE OR REPLACE PACKAGE body employee_info
IS
  PROCEDURE p IS
  BEGIN
    dbms_output.put_line('This is procedure');
    dbms_output.put_line(chr(10));
  END;

  FUNCTION f RETURN BOOLEAN IS
  BEGIN
    dbms_output.put_line('This is function ');
    dbms_output.put_line(chr(10));
    RETURN true;
  END;

BEGIN
  dbms_output.put_line('This is the initialization section of package body');
END employee_info;

我什么时候应该使用这个包的初始化部分?

如上例所示,当我第一次执行代码时,我只能看到程序包主体的 begin..end 被执行,其余的调用没有执行。

我正在使用以下语句执行过程和函数:

 execute employee_info.p;

    declare
      p1 boolean;
    begin
      p1 := employee_info.f;
    end;

包初始化部分顾名思义在包初始化时执行。当在建立会话后或在(重新)编译包后执行包中的第一个 procedure/function 时,会发生这种情况。目的是初始化可在会话生命周期内使用的包的全局状态。保留所有包全局变量,您可以稍后访问它们。

示例:

HUSQVIK@hq_pdb_tcp> CREATE OR REPLACE PACKAGE test_package
  2  IS
  3     PROCEDURE foo;
  4  END;
  5  /

Package created.

HUSQVIK@hq_pdb_tcp> CREATE OR REPLACE PACKAGE BODY test_package
  2  IS
  3     PROCEDURE foo
  4     IS
  5     BEGIN
  6             DBMS_OUTPUT.PUT_LINE('Procedure executed. ');
  7     END;
  8
  9  BEGIN
 10     DBMS_OUTPUT.PUT_LINE('Package initialized. ');
 11  END;
 12  /

Package body created.

HUSQVIK@hq_pdb_tcp> EXEC test_package.foo
Package initialized.
Procedure executed.

PL/SQL procedure successfully completed.

HUSQVIK@hq_pdb_tcp> EXEC test_package.foo
Procedure executed.

PL/SQL procedure successfully completed.

HUSQVIK@hq_pdb_tcp>

你看到编译包后初始化部分在执行过程foo时执行。该包现已初始化。 foo 的任何后续执行仅执行该过程。