Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle MERGE:apenas NOT MATCHED é acionado


Acho que você não entendeu para que serve o merge.

Eu esperaria que sua tabela fosse algo como:
CREATE TABLE TABLE_FOR_TESTS (
    d DATE,
    t NUMBER(8),
    CONSTRAINT TABLE_FOR_TESTS_PK PRIMARY KEY (d)
)

e, em seguida, a instrução de mesclagem poderia ser:
MERGE INTO TABLE_FOR_TESTS t
  USING (SELECT trunc(sysdate) d FROM DUAL) s
    ON (s.d = t.d)
  WHEN MATCHED THEN
    UPDATE SET t = t+1
  WHEN NOT MATCHED THEN         
    INSERT (d, t) VALUES (trunc(sysdate), 1)

onde a junção está na chave primária da tabela e atualize ou insira dependendo se o registro para esse valor PK existe.

Isso teria no máximo um registro por dia e t manteria o número de execuções dessa instrução por dia (assumindo que nenhum outro DML em TABLE_FOR_TESTS).

Nota:sysdate por si só inclui um componente de tempo. trunc(sysdate) o remove e define a hora para 00:00:00.