oracle SQL触发器
我应该写一个触发器来更新我的一个表中的属性。更具体地说: 我有一个属性为orderID、customerID、date、value的orders表,还有一个属性为orderID、articleID、quantity的OrderItems表。 订单中的价值是订单的组合价值,即每个订单项目的价格*数量之和。 现在,每当我按顺序更新、插入或删除任何项目时,触发器都应该保持属性值的更新。 插入和删除的触发器主体如下所示:oracle SQL触发器,sql,oracle,triggers,Sql,Oracle,Triggers,我应该写一个触发器来更新我的一个表中的属性。更具体地说: 我有一个属性为orderID、customerID、date、value的orders表,还有一个属性为orderID、articleID、quantity的OrderItems表。 订单中的价值是订单的组合价值,即每个订单项目的价格*数量之和。 现在,每当我按顺序更新、插入或删除任何项目时,触发器都应该保持属性值的更新。 插入和删除的触发器主体如下所示: IF INSERTING THEN UPDATE Orders SET v
IF INSERTING THEN
UPDATE Orders
SET value = value + (SELECT (:NEW.quantity* articles.price)
FROM articles
WHERE articles.articleID = :NEW.articleID)
WHERE Orders.OrderID= :NEW.OrderID;
END IF;
IF DELETING THEN
UPDATE Orders
SET value = value - (SELECT (:OLD.quantity * articles.price)
FROM articles
WHERE articles.articleID = :OLD.articleID)
WHERE Orders.OrderID= :OLD.OrderID;
END IF;
if inserting or deleting or updating then
if :NEW.quantity = :OLD.quantity and :NEW.article_id = :OLD.article_id then
null;
else
update orders set
value = value +
coalesce((
SELECT (:NEW.quantity * articles.price)
FROM articles
WHERE articles.articleID = :NEW.articleID), 0) -
coalesce((
SELECT (:OLD.quantity * articles.price)
FROM articles
WHERE articles.articleID = :OLD.articleID), 0)
where order_id = coalesce(:NEW.order_id, :OLD.order_id);
end if;
end if;
现在我们还有更新案例。这就是我的问题所在:当插入一个新的订单项目时,价值当然会增加,所以我可以像上面那样将新的价值添加到旧的订单项目上。删除也一样:我可以减去已删除行的值。但是对于update来说,它变得很棘手:取决于update语句是增加还是减少数量,更改商品ID意味着价格增加或减少,或者两者都做,值将增加或减少。到目前为止,我的方法是使用许多不同的IF子句来处理IF:OLD.quantity<:NEW.quantity then,但这不是正确的方法。有人有想法吗?我想你可以用以下三种逻辑来代替这三种逻辑:
UPDATE Orders
SET value = value + (SELECT (coalesce(:NEW.quantity, 0) - coalesce(:OLD.quantity, 0)) * a.price
FROM articles a
WHERE a.articleID = :NEW.articleID
)
WHERE Orders.OrderID= :NEW.OrderID;
请注意,您假设价格尚未更新。如果可能的话,最好重新计算整个订单价格。正确的想法是计算新旧差异。大概是这样的:
IF INSERTING THEN
UPDATE Orders
SET value = value + (SELECT (:NEW.quantity* articles.price)
FROM articles
WHERE articles.articleID = :NEW.articleID)
WHERE Orders.OrderID= :NEW.OrderID;
END IF;
IF DELETING THEN
UPDATE Orders
SET value = value - (SELECT (:OLD.quantity * articles.price)
FROM articles
WHERE articles.articleID = :OLD.articleID)
WHERE Orders.OrderID= :OLD.OrderID;
END IF;
if inserting or deleting or updating then
if :NEW.quantity = :OLD.quantity and :NEW.article_id = :OLD.article_id then
null;
else
update orders set
value = value +
coalesce((
SELECT (:NEW.quantity * articles.price)
FROM articles
WHERE articles.articleID = :NEW.articleID), 0) -
coalesce((
SELECT (:OLD.quantity * articles.price)
FROM articles
WHERE articles.articleID = :OLD.articleID), 0)
where order_id = coalesce(:NEW.order_id, :OLD.order_id);
end if;
end if;
如果我这样做,它会对行更新顺序显示SQL语句被忽略,对下面的行显示关键字FROM not found where expected这看起来不错,谢谢。但是如果我想改变商品而不是改变数量呢?没关系。它起作用了,我没有正确阅读。非常感谢你!