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