我是一个 PL/SQL 新手,我正在为触发器而苦苦挣扎。
描述:
我有三个对象 - 产品、包含、订单。一个产品可以有多个 CONTAINS,一个 ORDER 可以有多个 CONTAINS(基本上它曾经是 PRODUCT 和 ORDER 之间的多对多关系)。
每个产品都有一个“值”列,每个包含有一个“金额”列,每个订单都有一个“总计”列。
当我通过创建新的 CONTAINS 将新产品添加到 ORDER 时,我想重新计算 ORDER 上的字段“总计”。
示例:产品 X 的“值”为 100。产品 Y 的“值”为 200。我们有一个 ORDER O。现在我在产品 X 和 ORDER O 之间创建 CONTAINS,列“数量”为 5。现在触发器应该乘以 5 * 100 并将 ORDER 列“total”更新为 500。然后我在 PRODUCT Y 和 ORDER O 之间创建 CONTAINS,列“amount”为 10。现在触发器应该重新计算 5 * 100 + 10 * 200 并更新“total”列订购 O 至 2500。
我的错误触发器:
create or replace TRIGGER TRIGGER1
AFTER DELETE OR INSERT OR UPDATE OF AMOUNT, PRODUCT_ID_PRODUCT, ORDER_ID_ORDER ON CONTAINS
REFERENCING NEW AS n
FOR EACH ROW
DECLARE
value number;
amount number;
total number;
BEGIN
LOOP
FOR emp IN (SELECT AMOUNT, PRODUCT_ID_PRODUCT, ORDER_ID_ORDER FROM CONTAINS WHERE ORDER_ID_ORDER = :n.ORDER_ID_ORDER)
LOOP
(SELECT SUM(VALUE) into product FROM PRODUCT WHERE ID_PRODUCT = :emp.PRODUCT_ID_PRODUCT);
amount:= emp.AMOUNT;
total:= total + (product * amount);
UPDATE ORDER SET ORDER.TOTAL = total WHERE ID_ORDER = :n.ORDER_ID_ORDER;
END LOOP;
END LOOP;
END;
编辑:错误显示在这里:
(SELECT SUM(VALUE) into product FROM PRODUCT WHERE ID_PRODUCT = :emp.PRODUCT_ID_PRODUCT)
说我不能使用“emp”。
EDIT2:错误消息:
10/2 PLS-00103:在预期以下情况之一时遇到符号“SELECT”:(-+ case mod new not null continue avg count current exists max min prior sql stddev sum variance execute forall merge time timestamp interval date pipe <an交替 10/89 PLS-00103:在预期以下情况之一时遇到符号“)”:。( * @ % & - + ; / at for mod remaining rem <an exponent (**)> and or group have intersect minus order start union where connect || indicator multiset 15/5 PLS-00103:遇到符号“LOOP”预期以下情况之一时: