sql >> Base de Datos >  >> RDS >> Oracle

Compruebe si hay fechas superpuestas en cualquier fila de una tabla Oracle SQL

Supongo que necesitarías un disparador como este:

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;

Tenga en cuenta que FOR EACH ROW ¡la cláusula no se da!

De lo contrario, el activador ejecuta solo la fila actualmente insertada/actualizada, pero no se compara con ningún dato existente.

Considere también casos como este:

En la tabla, tiene un período del 1 al 30 de agosto, luego intenta agregar un período del 1 de mayo al 31 de diciembre. Por supuesto, tales situaciones también deben ser bloqueadas por el gatillo. Por lo tanto, solo necesita un disparador a nivel de instrucción, es decir, un disparador a nivel de fila que comprueba que solo la fila insertada/actualizada no es suficiente.