Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Sprawdź, czy daty nakładają się w dowolnym wierszu tabeli Oracle SQL

Myślę, że potrzebujesz wyzwalacza takiego jak ten:

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;

Zauważ, że FOR EACH ROW klauzula nie jest podana!

W przeciwnym razie wyzwalacz wykonuje tylko aktualnie wstawiony/zaktualizowany wiersz, ale nie porównuje z żadnymi istniejącymi danymi.

Rozważ także takie przypadki:

W tabeli masz okres od 1 do 30 sierpnia, następnie próbujesz dodać okres od 1 maja do 31 grudnia. Oczywiście takie sytuacje również powinien być blokowany przez spust. W związku z tym potrzebny jest tylko wyzwalacz na poziomie instrukcji, tj. wyzwalacz na poziomie wiersza, który sprawdza tylko wstawiony/zaktualizowany wiersz, nie jest wystarczający.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Liczba Oracle do C# dziesiętna

  2. Kontenery Oracle dla J2EE (OC4J) w R12

  3. ORA-29908:brak podstawowego wywołania dla operatora pomocniczego

  4. Nieistotna różnica planu wykonania z Oracle przy użyciu jdbc Timestamp lub Date

  5. Firmy programistyczne, które pracują nad Oracle D2k, PLSQL Technologies w Noida