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

Vérifier les dates qui se chevauchent sur n'importe quelle ligne d'une table Oracle SQL

Je suppose que vous auriez besoin d'un déclencheur comme celui-ci :

CREATE OR REPLACE TRIGGER TRGEPOCASNAOSOBREPOSTAS
    AFTER INSERT OR UPDATE
    ON EPOCA
  c INTEGER;
BEGIN
    SELECT COUNT(*)
    INTO c
    FROM EPOCA e
    WHERE EXISTS (
        SELECT 1
        FROM EPOCA ee 
        WHERE (e.DATA_INI BETWEEN ee.DATA_INI AND ee.DATA_FIM 
              OR e.DATA_FIM BETWEEN ee.DATA_INI AND ee.DATA_FIM) 
           AND ee.ROWID <> e.ROWID);

    IF c > 0 THEN
            RAISE_APPLICATION_ERROR(-20021, 'INSERT FAILED BECAUSE SELECTED DATES OVERLAP EXISTENT ONES');
    END IF;
END;

Notez que le FOR EACH ROW la clause n'est pas donnée !

Sinon, le déclencheur n'exécute que la ligne actuellement insérée/mise à jour, mais ne se compare à aucune donnée existante.

Considérez également des cas comme celui-ci :

Dans le tableau, vous avez une période du 1er au 30 août, puis vous essayez d'ajouter une période du 1er mai au 31 décembre. Bien sûr, de telles situations doivent également être bloquées par le déclencheur. Ainsi, vous n'avez besoin que d'un déclencheur au niveau de l'instruction, c'est-à-dire qu'un déclencheur au niveau de la ligne qui vérifie uniquement la ligne insérée/mise à jour n'est pas suffisant.