Oracle PRAGMA SERIALLY_REUSABLE;

时间:2014-11-27 21:09:50

标签: oracle plsql

我有一个像这样定义的包

create or replace 
package my_pk as
  myVar number := 0;
  procedure try;
end;

create or replace 
package body my_pk as
  procedure try as
  begin
    myVar := myVar + 1;
    dbms_output.put_line(myVar);
  end;
end;

我已经创建了一个简单的脚本来调用它

begin
my_pk.try;
end;

如果我执行了几次,myVar的值为:1,2,3等等。

例如,我需要将该变量用作全局变量,但我不希望在不同的会话中保持状态。

在网上看到我看到命令 PRAGMA SERIALLY_REUSABLE ,这是在多个会话中定义具有自己实例的全局变量的正确方法吗?

1 个答案:

答案 0 :(得分:2)

所以目前如果你在同一个会话中多次调用你的包,变量的值将是持久的,你将能够迭代它(如你所发现的那样)。

但是,您会注意到即使没有serially_reusable,变量的值也不会在多个会话之间持久存在。为了演示这一点,在PL / SQL Developer / Toad中打开另一个SQL * Plus实例或一个新窗口(每个都是一个独特的Oracle会话)。第一次调用时,每个会话都会创建一个my_pk的新实例。

如果您希望每次调用包时重新初始化包,即使在同一会话中,也可以使用

Pragma serially_reusable

如果您希望包变量的值保持不变,则应使用constant关键字,即

myVar constant number := 0;

但是,即使在包中,您也无法更改其值。

您设置的方式实际上取决于您的具体要求。