Oracle
 sql >> база данни >  >> RDS >> Oracle

Проверете за припокриващи се дати на всеки ред от таблица Oracle SQL

Предполагам, че ще ви трябва тригер като този:

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;

Обърнете внимание, че FOR EACH ROW клауза не е дадена!

В противен случай тригерът изпълнява само текущо вмъкнатия/актуализирания ред, но не сравнява с никакви съществуващи данни.

Помислете и за случаи като този:

В таблицата имате период от 1-ви до 30-ти август, след което се опитвате да добавите период от 1-ви май до 31-ви декември. Разбира се, такива ситуации също трябва да бъдат блокирани от спусъка. Следователно имате нужда само от тригер на ниво израз, т.е. тригер на ниво ред, който проверява само вмъкнатия/актуализирания ред, не е достатъчен.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да намеря зависимости в пакет оракул?

  2. Голямо .patch_storage

  3. ORA-01795:максималният брой изрази в списък е 1000, как да разделя низа

  4. Таблица за попълване на диапазони

  5. PHP OCI, Oracle и цифров формат по подразбиране