Oracle MERGE (upsert) ; необычное приращение SEQ val, даже если совпадение найдено

Я использую Oracle Merge для выполнения UPSERT. Казалось, он работает нормально, пока я не заметил, что мой SEQ всегда увеличивается на 1, даже когда при совпадении, затем сторона уравнения удовлетворяется. Я знаю, что сторона обновления уравнения вызывается, потому что статус обновляется по мере необходимости (имя является первичным ключом, поэтому это не будет работать только путем повторной вставки строки). Я включил мою процедуру ниже. Есть идеи, почему это происходит?

CREATE OR REPLACE PROCEDURE ff_update(argname  VARCHAR,
                                      argstate VARCHAR)
AS
  BEGIN

    MERGE INTO flags f
    USING (SELECT argname name FROM dual) b ON (f.name = b.name)
    WHEN MATCHED THEN
                UPDATE SET f.state = argstate
    WHEN NOT MATCHED THEN
                INSERT (f.id, f.name, f.state, f.notes1, f.notes2)
                VALUES (id_seq.nextval, argname, argstate, NULL, NULL);

  END ff_update;
  /

И последовательность

create sequence ID_SEQ
start with 1000000
increment by 1
nocache;

person cdugga    schedule 11.09.2013    source источник


Ответы (1)


Это ожидаемое поведение для MERGE.

См. примечание Metalink: 554656.1 «Объединить приращения SEQUENCE.NEXTVAL как для вставки, так и для обновления»

person David Aldridge    schedule 11.09.2013
comment
спасибо за это, я могу позволить себе пробелы в последовательности, поэтому я могу продолжить этот подход - person cdugga; 11.09.2013