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

Oracle:产品库存与数量触发器,oracle,plsql,triggers,Oracle,Plsql,Triggers,希望这是关于触发器的许多问题中的最后一个!仍在使用相同的数据库,其中订单行实体是订单和产品之间的链接实体。使用此触发器,我只想检查当前订单数量是否大于库存产品。目前,我会使用两个变量,Ordered(数量)和Total(库存),并对它们进行比较,但这不起作用。 如果数量大于库存,则必须删除插入的记录并引发错误 CREATE OR REPLACE TRIGGER Checks_Order BEFORE INSERT ON order_line FOR EACH ROW DECLARE orde

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

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
创建或替换触发器检查\u顺序
在订单行插入之前
每行
声明
有序整数;
总整数;
开始
从订单行选择“订单数量”,其中
ol.product\U no=:新的.product\U no;
如果(有序>0),则
从中选择p.stock INTO total
产品p,其中p.product\U no=:new.product\U no;
如果(排序<总计),则
从订单行ol中删除,其中ol.order\u no=:new.order\u no;
RAISE_应用程序_错误(-20103,“库存不足!”);
如果结束;
如果结束;
结束;
. 
跑

请提供帮助?

触发器将无法工作,因为您无法从触发器所属的表中选择甚至删除该触发器

但实际上您不需要这样做,所订购的值可以通过以下方式获得:new.quantity

如果您提出错误,则不会进行插入,无需
删除该行

因此,假设我正确理解了您的意图,以下内容应该满足您的要求:

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
而不是

当你说它不起作用时,你是什么意思?它仍然插入行吗?它不会抛出异常吗?太好了,非常感谢。对这一切的笨拙感到抱歉,我有点匆忙。我已经添加了一行删除适当数量的产品的库存了,再次感谢。