Oracle Merge语句中序列的行为

时间:2011-10-20 07:53:53

标签: sql oracle oracle10g

最近,我遇到了一个与在merge语句中递增序列值相关的问题。

MERGE INSERT子句正在访问一个序列以填充其中一列。我注意到,无论实际有多少行符合插入条件,序列最终会增加源SELECT子句中的记录总数。

为什么会这样?

我正在研究Oracle 10gR2

谢谢,

2 个答案:

答案 0 :(得分:2)

我找到了答案。根据Oracle文档,序列将针对每个合并记录递增,并且实际插入的记录数无关紧要。

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/pseudocolumns002.htm#sthref809

答案 1 :(得分:2)

你可以通过使用函数来增加像这样的值

来解决这个问题
CREATE OR REPLACE
FUNCTION seq_nextval_on_demand (p_seq_name  IN  VARCHAR2)
  RETURN NUMBER
IS
  v_seq_val  NUMBER;
BEGIN
  EXECUTE IMMEDIATE 'select ' || p_seq_name || '.nextval from dual'
     INTO v_seq_val;

  RETURN v_seq_val;
END seq_nextval_on_demand;

只有在真正使用merge语句的“insert”分支时才调用逻辑函数。

进一步参考 http://alex-td.blogspot.in/2012/07/sequences-nextval-in-merge-operator.html