【发布时间】:2012-03-31 11:53:02
【问题描述】:
如果我在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,但我无法完全弄清楚原因(除非它们同时运行,我认为它们不会同时运行)。
**NOTE1:为了记录,这是我继承的遗留代码,可能无法更改它,无论它的做法有多糟糕......
** 注意2:因为我认为该函数不可能同时执行多次,所以我正在研究是否可以在其他任何地方更新record_seq_num....
【问题讨论】:
-
如果
g_seq_num的当前值为NULL,您的函数似乎将返回NULL。不确定这是否是期望的行为——或者它可能永远不会发生,如果包变量被初始化为非 NULL 值——但这似乎很奇怪。