MERGE INTO TEST T1
USING TEST1 T2
ON(T1.ID=T2.ID AND FLAG='1')
WHEN MATCHED THEN
     SET DTIME=SYSDATE
WHEN NOT MATCHED THEN
     INSERT 
     (ID,FALG,DTIME)
     VALUES
     (TEST_SEQ.NEXTVAL,SYSDATE);注:test_seq的定义为:create sequence test_seq start with 1,increment by 1 minvalue 1 maxvalue 999999 nocache;问题:不知道为什么,无论是否matched,test_sequence的序号都会增加,请高手分析一下原因,谢谢

解决方案 »

  1.   

    这个是我今天写程序的时候发现的,亲自测试的,我怀疑是不是merge into在执行计划的时候,sequence.nextval已经赋值了
      

  2.   

    -- 你为什么要在merge into的时候,将test_seq.nextval 值插入到ID字段呢?
    -- 你了解merge into 的真正目的吗?
    -- 你是怎么插入的?是用的存储过程插入?还是直接用merge into 语句?
    -- 也就是想问:你在插入的时候,是否接收到了报错信息呢?-- 假如:你的test表的主键是ID字段,当你执行一个merge into的语句的时候,正好不符合插入要求,
    -- 但当你取test_seq.nextval插入test表中时,此时:test表中正好有一ID与test_seq.nextval相等,这个时候:插入还会成功吗?插入不成功,同时:test_seq.nextval是不是也就变了呢?
      

  3.   

    我对merge into 不是很了解,只是知道用它可以合并表,我上面的例子只是涂个方便那样写,因为实际上我操作的表有两百多个栏位,太多了不方便。其实not matched,序号增长对我的程序都没有影响,只是不明白为什么没有matched,序号也会增长,故发帖请高人解释!
    注:程序正确,无报错及警告信息。
      

  4.   


    对于通过merge语句合并的行,可以在insert语句或者update语句中,
    或者两个语句中,引用一个序列的nextval;
    对于每一行的update和insert,序列的nextval值都会自增,
    即使序列的值没有被引用到。
      

  5.   

    http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:5318183934935#72686343292015