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

Tjek for overlappede datoer på en hvilken som helst række i en tabel Oracle SQL

Jeg gætter på, at du har brug for en trigger som denne:

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;

Bemærk, FOR EACH ROW klausul er ikke givet!

Ellers udfører triggeren kun den aktuelt indsatte/opdaterede række, men sammenligner ikke med nogen eksisterende data.

Overvej også tilfælde som dette:

I tabellen har du en periode fra 1. til 30. august, derefter forsøger du at tilføje periode for 1. maj til 31. december. Naturligvis bør sådanne situationer også blokeres af udløseren. Du behøver således kun en udløser på sætningsniveau, dvs. en udløser på rækkeniveau, som kontrollerer, at kun den indsatte/opdaterede række ikke er tilstrækkelig.




  1. Gå gennem løkken for at finde gentagne navne

  2. Fejl under afsendelse af QUERY-pakke

  3. PHP-fejl:Kald til en medlemsfunktion rowCount() på et ikke-objekt

  4. NHibernate vil indsætte, men ikke opdatere, efter flytning til vært med delt server, der kører mysql