PRAGMA SERIALLY_REUABLE是PACKAGE一个可选项,决定所创建的包是否可以连续调用。如果省略,则包的运行状态被放在用户全局区;如果使用,则包的运行状态被放在系统全局区,这样每次调用之后,该包的运行状态就会被释放:可以连续被调用,而不受以前的运行状态的影响。
例如:
CREATE OR REPLACE PACKAGE test_sr_yes_pkg IS
PRAGMA SERIALLY_REUSABLE;
counter NUMBER;
g_num NUMBER := to_char(SYSDATE, 'ss');
PROCEDURE test;
END test_sr_yes_pkg;
/
CREATE OR REPLACE PACKAGE BODY test_sr_yes_pkg IS
PRAGMA SERIALLY_REUSABLE;
PROCEDURE test IS
BEGIN
counter := nvl(counter, 0) + 1;
dbms_output.put_line('第' || counter || '次调用YES包,G_NUM=' || g_num);
END test;
END test_sr_yes_pkg;
/
CREATE OR REPLACE PACKAGE test_sr_no_pkg IS
counter NUMBER;
g_num NUMBER := to_char(SYSDATE, 'ss');
PROCEDURE test;
END test_sr_no_pkg;
/
CREATE OR REPLACE PACKAGE BODY test_sr_no_pkg IS
PROCEDURE test IS
BEGIN
counter := nvl(counter, 0) + 1;
dbms_output.put_line('第' || counter || '次调用NO包,G_NUM=' || g_num);
END test;
END test_sr_no_pkg;
/
测试脚本
BEGIN
test_sr_yes_pkg.test;
test_sr_no_pkg.test;
END;
测试结果:
第1次调用YES包,G_NUM=46
第11次调用NO包,G_NUM=37
NO包中的COUNTER可以一直增加,但是第一次调用时将G_NUM初始化,此后调用将不再改变;
YES包中的COUNTER由于每次调用都被初始化,所以一直是1,同理G_NUM也一直变化。