包的初始化部分
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
的任何后续执行仅执行该过程。
这是包装规格:
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
的任何后续执行仅执行该过程。