如果我在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 ....
答案 0 :(得分:2)
我认为你的问题的答案有点,是的。
每个数据库会话都有自己的包变量副本。会话之间不共享它们。您所描述的并不是创建序列的安全方法。如果您有一个会话多次命中该函数,则其包变量的副本将递增,但另一个会话将不会递增。因此,会话A可能会返回1,2,3 ......然后会话B将返回1.
此外,当会话关闭或包重新编译时,您的包变量将被丢弃。
以下是关于“Global variable across different sessions”
的问问汤问题您应该使用Oracle sequence。