[英]Oracle SQL Trigger: After Update, Insert Rows into Another Table
我正在嘗試在一個表上編寫一個觸發器,該觸發器在庫存數量 = 0 時觸發。然后它將向另一個表中添加一行,其中包含 product_id 和 store_id,以指示需要評估該項目以進行重新排序。 經過4個多小時的搜索和嘗試,我在這里注冊了一個帳戶。 我是新用戶,這可能完全關閉。
這是我最近的嘗試:
CREATE OR REPLACE TRIGGER ORDERS_AFTER_UPDATE
AFTER UPDATE
OF QUANTITY_STOCK
ON INVENTORY
FOR EACH ROW
WHEN (NEW.QUANTITY_STOCK - OLD.QUANTITY_STOCK = 0)
BEGIN
SELECT PRODUCT_ID, STORE_ID
INTO PURCHASE_NEW
FROM INVENTORY
WHERE QUANTITY_STOCK = 0;
END;
相關表是 INVENTORY,具有 PRODUCT_ID、STORE_ID,以及 QUANTITY_STOCK 和 PURCHASE_NEW,具有 PRODUCT_ID 和 STORE_ID。 當 QUANTITY_STOCK 的值 = 0 時,我希望它從 INVENTORY 表中將 PRODUCT_ID 和 STORE_ID 復制到 PURCHASE_NEW 表中。
我收到的錯誤是:
Error(8,1): PL/SQL: SQL Statement ignored
Error(9,6): PLS-00403: expression 'PURCHASE_NEW' cannot be used as an INTO-target of a SELECT/FETCH statement
Error(9,19): PL/SQL: ORA-00904: : invalid identifier
非常感謝。
使用INSERT
將行插入到表中。 您可以使用:NEW
訪問該行的新值。 如果您想知道新的quantity_stock
數量是否為零,請檢查:new.quantity_stock = 0
。 然而,在觸發器的WHEN
子句中, NEW
前面不能有冒號。
CREATE OR REPLACE TRIGGER orders_after_update
AFTER UPDATE OF quantity_stock ON inventory
FOR EACH ROW
WHEN (new.quantity_stock = 0)
BEGIN
INSERT INTO purchase_new (product_id, store_id) VALUES (:new.product_id, :new.store_id);
END;
我不知道你為什么要檢查新的和舊的quantity_stock
值; 只有當您將該值更新為原來的值時,您編寫的代碼才會觸發觸發器,因為只有這樣它們的差異才會為零。 但是,我希望你知道你在做什么。
樣本數據:
SQL> create table inventory (product_id number, store_id number, quantity_stock number);
Table created.
SQL> create table purchase_new (product_id number, store_id number);
Table created.
SQL> insert into inventory values (100, 1, 20);
1 row created.
SQL> insert into inventory values (200, 2, 50);
1 row created.
SQL>
SQL> create or replace trigger orders_after_update
2 after update of quantity_stock
3 on inventory
4 for each row
5 when (new.quantity_stock - old.quantity_stock = 0)
6 begin
7 insert into purchase_new (product_id, store_id)
8 values (:new.product_id, :new.store_id);
9 end;
10 /
Trigger created.
什么都不會發生,因為舊值和新值不一樣:
SQL> update inventory set quantity_stock = 15 where product_id = 100;
1 row updated.
SQL> select * From inventory;
PRODUCT_ID STORE_ID QUANTITY_STOCK
---------- ---------- --------------
100 1 15
200 2 50
SQL> select * From purchase_new;
no rows selected
但是,如果它們相等,那么 trigger 會做一些事情:
SQL> update inventory set quantity_stock = 15 where product_id = 100;
1 row updated.
SQL> select * From inventory;
PRODUCT_ID STORE_ID QUANTITY_STOCK
---------- ---------- --------------
100 1 15
200 2 50
SQL> select * From purchase_new;
PRODUCT_ID STORE_ID
---------- ----------
100 1
SQL>
如果觸發線 #5 是
when (new.quantity_stock = 0)
那么它會更有意義(至少對我來說)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.