簡體   English   中英

Oracle SQL 觸發器:更新后,將行插入另一個表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM