Oracle:产品库存与数量触发器

时间:2011-12-10 13:50:00

标签: oracle plsql triggers

希望这是关于触发器的许多问题中的最后一个!仍在使用Order_line实体是Order和Products之间的链接实体的同一数据库。使用此触发器,我只想检查当前订单数量是否大于产品中的库存。目前我将通过使用两个变量,Ordered(数量)和Total(Stock)并比较它们来做到这一点,但这不起作用。 如果数量大于库存,则必须删除插入的记录并引发错误。

CREATE OR REPLACE TRIGGER Checks_Order
BEFORE INSERT ON order_line
FOR EACH ROW 
DECLARE 
ordered int; 
total INT; 

BEGIN
SELECT ol.quantity INTO ordered FROM order_line ol WHERE 
ol.product_no = :new.product_no; 

if(ordered>0) then
SELECT p.stock INTO total FROM
products p WHERE p.product_no = :new.product_no; 
  IF (ordered < total) then 
DELETE FROM order_line ol where ol.order_no = :new.order_no; 
  RAISE_APPLICATION_ERROR(-20103, 'Not enough stock!');
END IF;
 END IF;

END;
. 
run

请帮帮忙?

1 个答案:

答案 0 :(得分:2)

触发器不起作用,因为您无法从触发器所属的表中选择甚至删除。

但实际上并不需要,可以通过以下方式获得有序的值:new.quantity。

如果你提出错误,INSERT将不会发生,不需要DELETE该行。

所以 - 假设我理解你的意图正确 - 以下应该做你想做的事:

CREATE OR REPLACE TRIGGER Checks_Order
BEFORE INSERT ON order_line
FOR EACH ROW 
DECLARE 
  total INT; 
BEGIN
  if (:new.quantity > 0) then
    SELECT p.stock 
       INTO total 
    FROM products p 
    WHERE p.product_no = :new.product_no; 

    IF (:new.quantity > total) then 
      RAISE_APPLICATION_ERROR(-20103, 'Not enough stock!');
    END IF;
  END IF;

END;
/ 

顺便说一下:我想你想要:new.quantity > total而不是&lt;总