对于典型的产品和运输数据库,我正在探索运行触发器的最佳方法:
- 当订单行设置为“完成”时,将运行触发器:
- 查找该订单的任何其他订单行。
- 如果该订单的所有其他订单行也是“完成”
- 更新订单标题表以完成。
对于 clatiry:订单标题表将存储整个订单总额,而 orderLines 表存储订单的每个产品。
到目前为止,触发器是这样编写的:
CREATE OR REPLACE TRIGGER orderComplete
after update ON orderline
for each row
WHEN (new.orderline_fulfilled = 'Y')
DECLARE count NUMBER := 5;
ordersNotDone NUMBER;
BEGIN
SELECT COUNT(Orderline_fulfilled) INTO ordersNotDone
FROM orderHeader
JOIN orderline ON
orderHeader.Order_id = orderLine.Orderline_order
WHERE Order_id = :old.orderline_order
AND orderline_fulfilled = 'Y';
IF ordersNotDone = 0
THEN
UPDATE orderHeader
SET completed = SYSDATE
WHERE orderId = :old.orderline_order;
ENDIF;
END;
在更新订单行时,上述情况会导致突变错误。