Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Periksa tanggal yang tumpang tindih pada setiap baris tabel Oracle SQL

Saya kira Anda akan membutuhkan pemicu seperti ini:

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;

Perhatikan, FOR EACH ROW klausa tidak diberikan!

Jika tidak, pemicu hanya menjalankan baris yang saat ini dimasukkan/diperbarui tetapi tidak membandingkan dengan data yang ada.

Pertimbangkan juga kasus seperti ini:

Dalam tabel Anda memiliki periode dari 1 hingga 30 Agustus, kemudian Anda mencoba menambahkan periode untuk 1 Mei hingga 31 Desember. Tentu saja, situasi seperti itu juga harus diblokir oleh pemicunya. Jadi, Anda hanya memerlukan pemicu tingkat pernyataan, yaitu pemicu tingkat baris yang hanya memeriksa baris yang dimasukkan/diperbarui tidak cukup.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kombinasi dari Satu Tabel, Dikelompokkan Berdasarkan Nilai Kolom

  2. cx_Oracle.DatabaseError:ORA-12514:TNS:pendengar saat ini tidak mengetahui layanan yang diminta di deskriptor koneksi

  3. membandingkan dua kursor di Oracle alih-alih menggunakan MINUS

  4. Cara memilih grup item terkait di Oracle SQL

  5. fungsi pl/sql dipanggil berapa kali?