希望这是关于触发器的许多问题中的最后一个!仍在使用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
请帮帮忙?
答案 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;总强>