[Oracle] When matched then - update existing row and insert new row

0

Witam,
Mam problem z procedurą w Oracle.
Mam dwie tabeli:

  • CS_TARGET
  • CS_SOURCE

Chcę zrobić logikę:

  1. Jeżeli nie ma takiego rekordu to niech doda (INSERT)
  2. Jeżeli jest taki rekord to niech dopisze "HISTORIĘ" czyli zaktualizuje istniejący: zmieni END_DATE na sysdate i CUR_VER na 0
    ORAZ zrobi insert i doda nowy wiersz tylko z nowymi wartościami jakie mogą przyjść oraz START_DATE i END_DATE na sysdate oraz CUR_VER na 1 oraz REV niech dostanie kolejny numerek z sekwencji.

Problem polega na tym, że nie da się lub nie wiem jak użyć UPDATE i INSERT przy 'WHEN MATCHED THEN'. Czy da się to zapisać w jakiś fajny sposób?
Mój kod poniżej.

MERGE INTO CS_TARGET reg
USING ( SELECT c001,
    c002,
    c003,
    c004,
    c005,
    c006,
    c007,
    c008,
    c009,
    c010,
    c011,
    c012,
    c013,
    c014
    FROM CS_SOURCE where c='I' and seq_id > 1 ) zal
ON (reg.NR1 = zal.C002 and reg.NR2 = zal.C003)
WHEN NOT MATCHED THEN
    INSERT  (
    * -- zamiast gwiazdki są nazwy kolumn
-- ponizej kolumny techniczne
    START_DATE,
    END_DATE,
    CUR_VER,
    REV
    )
    VALUES (
    c001,
    c002,
    c003,
    c004,
    c005,
    c006,
    c007,
    c008,
    c009,
    c010,
    c011,
    c012,
    c013,
    c014,
    vPID,
    sysdate,
    to_date ('9999-11-11','YYYY-MM-DD'),
    1,
    I_SEQ_ID.NEXTVAL
    )
WHEN MATCHED THEN
UPDATE set reg.END_DATE = sysdate, reg.CUR_VER = 0 
INSERT  (
    *
    START_DATE,
    END_DATE,
    CUR_VER,
    REV
    )
VALUES (
    c001,
    c002,
    c003,
    c004,
    c005,
    c006,
    c007,
    c008,
    c009,
    c010,
    c011,
    c012,
    c013,
    c014,
    vPID,
    sysdate,
    to_date ('9999-11-11','YYYY-MM-DD'),
    1,
    I_SEQ_ID.NEXTVAL
    )
    ;
0

Merge nie przewiduje takiej konstrukcji. WHEN MATCHED może zawierać tylko UPDATE (opcjonalnie z dalszym DELETE).

Nie napisałeś ile rekordów może zwrócić select, ale jeśli jeden to może nie ma sensu kombinować z MERGE.

1 użytkowników online, w tym zalogowanych: 0, gości: 1