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

bagaimana cara memicu pembaruan pada nilai baris tabel menggunakan nilai baris dari tabel lain di Apex Oracle SQL?

Anda menggunakan nilai :OLD di pemicu Anda yang tampaknya bermasalah. Pada INSERT nilai :OLD semuanya NULL. Jadi dalam kasus INSERT, setidaknya, sepertinya Anda ingin menggunakan nilai :NEW.

Pada UPDATE, nilai :OLD berisi nilai pra-pembaruan. Saya tidak tahu bagaimana tabel stok Anda dipertahankan, tetapi menurut saya Anda ingin menambahkan nilai :OLD kembali ke stok kemudian menghapus nilai :NEW dari stok, dengan asumsi bahwa ORDER_QUANTITY dan STOCK_ID dapat berubah.

Saat Anda melakukan DELETE nilai :OLD berisi nilai pra-penghapusan, tetapi nilai :NEW semuanya NULL (masuk akal, jika Anda memikirkannya). Jadi dalam kasus penghapusan, sepertinya Anda ingin menggunakan nilai :OLD. Namun, jika Anda menghapus PO, apakah Anda benar-benar mau menyesuaikan stok? Saya rasa Anda memerlukan beberapa jenis status pada pesanan untuk memberi tahu Anda apakah pesanan telah dipenuhi atau dibatalkan atau apa pun, dan hanya menambahkan stok kembali ke tabel stok massal jika pesanan tidak pernah terpenuhi.

Bagaimanapun, satu cara untuk menulis ulang pemicu Anda adalah:

create or replace trigger UPDATE_ON_PURCHASE
  BEFORE insert or update or delete on PURCHASE_ORDER
  for each row
  begin
    IF INSERTING THEN
      UPDATE bulk_stock
        SET BULK_QUANTITY = BULK_QUANTITY - :NEW.ORDER_QUANTITY
        WHERE STOCK_ID = :NEW.STOCK_ID; 
    ELSIF UPDATING THEN
      UPDATE BULK_STOCK
        SET BULK_QUANTITY = BULK_QUANTITY + :OLD.ORDER_QUANTITY
        WHERE STOCK_ID = :OLD.STOCK_ID; 

      UPDATE BULK_STOCK
        SET BULK_QUANTITY = BULK_QUANTITY - :NEW.ORDER_QUANTITY
        WHERE STOCK_ID = :NEW.STOCK_ID; 
    ELSIF DELETING THEN
      UPDATE BULK_STOCK
        SET BULK_QUANTITY = BULK_QUANTITY + :OLD.ORDER_QUANTITY
        WHERE STOCK_ID = :OLD.STOCK_ID;
    END IF;
  end;

Saya tidak yakin bahwa logika ini benar-benar yang Anda inginkan karena saya tidak mengerti sepenuhnya apa yang Anda coba lakukan, terutama dalam kasus DELETE, jadi ambillah sebagai contoh dan terapkan logika apa pun yang dibutuhkan oleh situasi Anda.

Saya juga akan mengatakan bahwa saya pikir menempatkan logika ini dalam pemicu adalah pilihan yang buruk. Logika bisnis seperti ini tidak boleh diimplementasikan di trigger - lebih baik memasukkannya ke dalam prosedur dan memanggil prosedur saat dibutuhkan. Menempatkan logika bisnis ke dalam pemicu dapat menimbulkan masalah .

Semoga berhasil.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa Oracle tidak menunjukkan bagian bilangan bulat dari desimal

  2. Refleksi di PLSQL?

  3. ORA-00913 Kesalahan saat menggunakan banyak pernyataan IN

  4. LOCALTIMESTAMP() Fungsi di Oracle

  5. Bagaimana cara membatalkan operasi Database yang sudah berjalan lama?