Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Suchen Sie nach sich überschneidenden Daten in jeder Zeile einer Oracle SQL-Tabelle

Ich schätze, Sie würden einen Trigger wie diesen brauchen:

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;

Beachten Sie den FOR EACH ROW Klausel ist nicht angegeben!

Andernfalls führt der Trigger nur die aktuell eingefügte/aktualisierte Zeile aus, vergleicht aber nicht mit vorhandenen Daten.

Betrachten Sie auch Fälle wie diesen:

In der Tabelle haben Sie einen Zeitraum vom 1. bis 30. August, dann versuchen Sie, den Zeitraum für den 1. Mai bis 31. Dezember hinzuzufügen. Natürlich sollten auch solche Situationen durch den Abzug blockiert werden. Daher benötigen Sie nur einen Trigger auf Anweisungsebene, d. h. ein Trigger auf Zeilenebene, der nur die eingefügte/aktualisierte Zeile prüft, ist nicht ausreichend.