Oracle
 sql >> Database >  >> RDS >> Oracle

Verifica la presenza di date sovrapposte su qualsiasi riga di una tabella Oracle SQL

Immagino che avresti bisogno di un trigger come questo:

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;

Nota, il FOR EACH ROW la clausola non è data!

In caso contrario, il trigger esegue solo la riga attualmente inserita/aggiornata ma non viene confrontata con i dati esistenti.

Considera anche casi come questo:

Nella tabella hai un periodo dal 1° al 30 agosto, poi provi ad aggiungere il periodo dal 1° maggio al 31 dicembre. Naturalmente, tali situazioni dovrebbero essere bloccate anche dal grilletto. Quindi è necessario solo un trigger a livello di istruzione, ovvero un trigger a livello di riga che controlli solo la riga inserita/aggiornata non è sufficiente.