Oracle包变量的安全性

时间:2012-03-14 23:20:54

标签: oracle variables package

如果我在Oracle(8)中有一个包变量,并且在从多个触发器调用的函数中被修改(递增),是否可能一次多次调用该函数?

具体来说,我们在业务事务中有序列号,因此我们有一个函数返回特定会话的序列中的下一个数字,然后是一个函数,它创建一个递增表示序列号的包变量。基本上,功能类似于:

function get_seq_num return number is
  ret number;
begin
  if g_seq_num is not null then
    ret := g_seq_num;
    g_seq_num := g_seq_num + 1;
  else
    g_seq_num := 1;
  end if;
  return ret;
end get_seq_num;

似乎有2个触发器尝试为给定的事务记录相同的seq_num,我无法理解为什么(除非它们同时运行,我认为它们不会)。

**注1:为了记录,这是我继承的遗留代码,无论它的实践有多糟糕,我都可能无法改变它....

**注2:因为我认为函数不可能同时执行多次,所以我在研究是否可以在其他任何地方更新record_seq_num ....

1 个答案:

答案 0 :(得分:2)

我认为你的问题的答案有点,是的。

每个数据库会话都有自己的包变量副本。会话之间不共享它们。您所描述的并不是创建序列的安全方法。如果您有一个会话多次命中该函数,则其包变量的副本将递增,但另一个会话将不会递增。因此,会话A可能会返回1,2,3 ......然后会话B将返回1.

此外,当会话关闭或包重新编译时,您的包变量将被丢弃。

以下是关于“Global variable across different sessions

的问问汤问题

您应该使用Oracle sequence