sql >> Database >  >> RDS >> Oracle

Controleer op overlappende datums in elke rij van een tabel Oracle SQL

Ik denk dat je een trigger zoals deze nodig hebt:

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;

Let op, de FOR EACH ROW clausule is niet gegeven!

Anders voert de trigger alleen de momenteel ingevoegde/bijgewerkte rij uit, maar wordt niet vergeleken met bestaande gegevens.

Overweeg ook gevallen als deze:

In de tabel heb je een periode van 1 t/m 30 augustus, dan probeer je een periode van 1 mei t/m 31 december toe te voegen. Natuurlijk moeten dergelijke situaties ook worden geblokkeerd door de trigger. U hebt dus alleen een trigger op instructieniveau nodig, d.w.z. een trigger op rijniveau die alleen de ingevoegde/bijgewerkte rij controleert, is niet voldoende.




  1. JSON van twitter API bevat \u2019

  2. INSERT met dynamische tabelnaam in triggerfunctie

  3. Hoe controleer ik het maximum aantal toegestane verbindingen met een Oracle-database?

  4. Problemen met het genereren van een lijst in python en het opslaan ervan in een mysql-database