Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Kiểm tra các ngày trùng lặp trên bất kỳ hàng nào của bảng Oracle SQL

Tôi đoán bạn sẽ cần một trình kích hoạt như thế này:

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;

Lưu ý, FOR EACH ROW mệnh đề không được đưa ra!

Nếu không, trình kích hoạt chỉ thực hiện hàng hiện được chèn / cập nhật nhưng không so sánh với bất kỳ dữ liệu hiện có nào.

Cũng xem xét các trường hợp như thế này:

Trong bảng, bạn có khoảng thời gian từ ngày 1 đến ngày 30 tháng 8, sau đó bạn cố gắng thêm khoảng thời gian từ ngày 1 tháng 5 đến ngày 31 tháng 12. Tất nhiên, những tình huống như vậy cũng nên được ngăn chặn bởi trình kích hoạt. Do đó, bạn chỉ cần trình kích hoạt cấp câu lệnh, tức là trình kích hoạt cấp hàng chỉ kiểm tra hàng được chèn / cập nhật là không đủ.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn được phân tách bằng dấu phẩy cho nhiều tham số trong PLSQL

  2. Thực thi nhiều lệnh dưới dạng tên người dùng khác trong một tệp trong trình bao BASH

  3. Bảng tạm thời cục bộ trong Oracle 10 (đối với phạm vi của Thủ tục được lưu trữ)

  4. Oracle - ORA-01489:kết quả của việc nối chuỗi quá dài

  5. Không thể tìm thấy nhà cung cấp cơ sở dữ liệu Entity Framework tương thích với phiên bản này