包的初始化部分

Wol*_*ang 2 oracle plsql initialization package

这是包规范:

CREATE OR REPLACE PACKAGE employee_info
IS
  PROCEDURE p;

  FUNCTION f RETURN BOOLEAN;

END employee_info;
Run Code Online (Sandbox Code Playgroud)

这是包体:

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;
Run Code Online (Sandbox Code Playgroud)

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

如上例所示,当我第一次执行代码时,我只能看到package body的begin..end被执行,而其余的调用则不会执行.

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

 execute employee_info.p;

    declare
      p1 boolean;
    begin
      p1 := employee_info.f;
    end;
Run Code Online (Sandbox Code Playgroud)

Hus*_*vik 7

初始化包时执行包名称建议的包初始化部分.当在建立会话之后或在(重新)编译包之后执行包中的第一个过程/函数时,会发生这种情况.目的是初始化可在会话生存期内使用的包的全局状态.保留所有包全局变量,您可以稍后访问它们.

例:

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>
Run Code Online (Sandbox Code Playgroud)

您会看到在编译包之后,在执行过程时foo执行初始化部分.包现在已初始化.任何后续foo执行只执行过程.