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

Oracle DBMS - Membaca tabel sebelum memproses Memperbarui dalam pemicu SETELAH - mengubah tabel

Hanya untuk memperjelas, pengecualian tabel bermutasi dilemparkan karena Anda mencoba membaca dari rooms tabel di fungsi Anda, bukan karena Anda mencoba membaca dari properties meja. Karena Anda memiliki pemicu tingkat baris di rooms , artinya rooms tabel berada di tengah-tengah perubahan saat pemicu tingkat baris diaktifkan dan mungkin dalam keadaan tidak konsisten. Oracle mencegah Anda menanyakan rooms tabel dalam situasi itu karena hasilnya belum tentu deterministik atau dapat direproduksi.

Jika Anda membuat pemicu tingkat pernyataan (menghapus FOR EACH ROW ) dan letakkan logika Anda di sana, Anda tidak akan lagi menemukan pengecualian tabel bermutasi karena rooms tabel tidak akan lagi dalam keadaan tidak konsisten. Namun, pemicu tingkat pernyataan tidak dapat melihat baris mana yang dimodifikasi. Itu berarti Anda perlu melihat ke seluruh properti untuk melihat nilai status mana yang harus disesuaikan. Itu tidak akan terlalu efisien.

Dengan biaya kerumitan tambahan, Anda dapat meningkatkan kinerja dengan menangkap properti mana yang berubah di pemicu tingkat baris dan kemudian merujuknya ke pemicu tingkat pernyataan. Itu umumnya membutuhkan tiga pemicu dan satu paket, yang jelas meningkatkan jumlah bagian yang bergerak secara substansial (jika Anda menggunakan 11.2, Anda dapat menggunakan pemicu gabungan dengan tiga pemicu komponen yang menyederhanakan hal-hal sedikit dengan menghilangkan kebutuhan untuk menggunakan paket) . Itu akan terlihat seperti

CREATE OR REPLACE PACKAGE trigger_collections
AS
  TYPE modified_property_tbl IS TABLE OF properties.property_id%type;
  g_modified_properties modified_property_tbl;
END;

-- Initialize the collection in a before statement trigger just in case
-- there were values there from a prior run
CREATE OR REPLACE TRIGGER trg_initialize_mod_prop_coll
  BEFORE INSERT OR UPDATE ON rooms
BEGIN
  trigger_collections.g_modified_properties := trigger_collections.modified_property_tbl();
END;

-- Put the property_id of the modified row in the collection
CREATE OR REPLACE TRIGGER trg_populate_mod_prop_coll
  AFTER INSERT OR UPDATE ON rooms
  FOR EACH ROW
BEGIN
  trigger_collections.g_modified_properties.extend();
  trigger_collections.g_modified_properties( trigger_collections.g_modified_properties.count + 1 ) := :new.property_id;
END;

CREATE OR REPLACE TRIGGER trg_process_mod_prop_coll
  AFTER INSERT OR UPDATE ON rooms
BEGIN
  FOR p IN 1 .. trigger_collections.g_modified_properties.count
  LOOP
    IF prop_vacancy_query( trigger_collections.g_modified_properties(i) ) = 0 
    THEN
      ...
END;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara menggunakan fungsi Analitik di oracle (Over Partition by Keyword)

  2. Apakah kebuntuan mungkin terjadi saat memperbarui dan menghapus baris yang berbeda dalam sebuah tabel?

  3. Dapatkan semua baris tabel diperbarui setelah waktu tertentu

  4. Bagaimana mengukur kinerja kueri di Oracle

  5. Masalah dengan pengurangan tanggal di Oracle