sql >> Databasteknik >  >> RDS >> Oracle

Kontrollera efter överlappande datum på valfri rad i en tabell Oracle SQL

Jag antar att du skulle behöva en trigger som denna:

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;

Observera, FOR EACH ROW klausul ges inte!

Annars utför utlösaren bara den för närvarande infogade/uppdaterade raden men jämförs inte med någon befintlig data.

Tänk även på fall som detta:

I tabellen har du en period från 1:a till 30:e augusti, sedan försöker du lägga till period för 1:a maj till 31:e december. Naturligtvis bör sådana situationer också blockeras av avtryckaren. Därför behöver du bara en utlösare på uttalandenivå, dvs. en utlösare på radnivå som kontrollerar att endast den infogade/uppdaterade raden inte räcker.




  1. MySQL-fråga baserad på användarinmatning

  2. SUBSTR() Funktion i Oracle

  3. Hur kontrollerar man om MySQL-tabellen är UTF-8 och har storageEngine InnoDB?

  4. datanukleus + jpa + orakel. Konstigt fel med tabeller som inte existerar