Witam,
Mam problem z procedurą w Oracle.
Mam dwie tabeli:
- CS_TARGET
- CS_SOURCE
Chcę zrobić logikę:
- Jeżeli nie ma takiego rekordu to niech doda (INSERT)
- 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
)
;