Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle MERGE :seul NOT MATCHED est déclenché

Je pense que vous avez mal compris à quoi sert la fusion.

Je m'attendrais à ce que votre table ressemble à :

CREATE TABLE TABLE_FOR_TESTS (
    d DATE,
    t NUMBER(8),
    CONSTRAINT TABLE_FOR_TESTS_PK PRIMARY KEY (d)
)

puis l'instruction de fusion pourrait être :

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)

où la jointure est sur la clé primaire de la table et mettre à jour ou insérer selon que l'enregistrement pour cette valeur PK existe ou non.

Cela aurait un maximum d'un enregistrement par jour et t contiendrait le nombre d'exécutions de cette instruction par jour (en supposant qu'il n'y a pas d'autre DML sur TABLE_FOR_TESTS).

Remarque :sysdate en lui-même inclut un composant de temps. trunc(sysdate) le supprime et définit l'heure sur 00:00:00.