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