创建触发器以更新另一个表的列

时间:2014-11-27 04:12:59

标签: sql triggers oracle11g

我正在尝试创建一个触发器,它会为我提供订单的总金额。我有一个表ORNG_ORD_LINE,其中包含特定订单的多行。在我的ORNG_ORDER表中,我希望有一个列显示ORNG_ORD_LINE中具有相同订单号的项目的总成本。

此触发器的目标是更新Ord_Amount列中的ORNG_ORDER表,其中包含存储在ORNG_ORD_LINE表中的所有Ord_Num个别行项的计算总和。因此,如果我插入或更新Ord_Num 20002,每行50美元,则Ord_Amount列应为$ 150。如果我使用新金额更新或插入具有相同订单号的行,或删除行,则Ord_Amount应更正其值以反映更新的总计。

获取每个订单行总金额的触发器如下:

CREATE OR REPLACE TRIGGER ORNG_ORD_LINE_TOTAL_TRIGGER 
FOR UPDATE OR INSERT ON ORNG_ORD_LINE  
COMPOUND TRIGGER 
BEFORE EACH ROW IS 
BEGIN 
    :NEW.Ord_Line_Total := :NEW.Ord_Line_Price * :NEW.Ord_Line_Quantity; 
    END BEFORE EACH ROW; 
END ORNG_ORD_LINE_TOTAL_TRIGGER;
/

这为我提供了INV_LINE表中每张发票的总额。我想创建一个触发器,它将为每个分配了相同发票编号的单独行添加,以获得整个订单的总计,并使该编号更新ORNG_ORDER表中的Ord_Amount列。我还想确保如果我要从ORNG_ORD_LINE中删除一行,那么触发器将更新反映更改的ORNG_ORDER中的总数。这是我到目前为止所做的,但我在语法方面遇到了一些问题,我希望有人能帮助我解决这个问题:

    CREATE OR REPLACE TRIGGER ORNG_ORDER_TOTAL_TRIGGER 
    AFTER INSERT OR UPDATE ON ORNG_ORD_LINE
    DECLARE
    V_ORD_LINE_TOTAL DEC := 0
    V_ORD_NUM INTEGER := 0

    BEGIN
    --1) Get the Order Number

    SELECT :NEW.Ord_Num INTO V_ORD_NUM
    FROM ORNG_ORDER
    WHERE ORNG_ORDER.Ord_Num = :NEW.Ord_Num;

    --2) Get the sum of all lines with the matching order number and set the 
variable with that value

    V_ORD_LINE_TOTAL := 

    SELECT SUM(Ord_Line_Total)
    FROM ORNG_ORD_LINE
    WHERE Ord_Num = :NEW.Ord_Num;

    --3) Write updated total to the ORNG_ORDER tables

    UPDATE ORNG_ORDER
    SET Ord_Amount = V_ORD_LINE_TOTAL
    WHERE Ord_Num = :NEW.Ord_Num;

    END ORNG_ORDER_TOTAL_TRIGGER;
    /

我仍然试图掌握这一点,所以任何帮助和对我做错事的解释都将不胜感激。

1 个答案:

答案 0 :(得分:0)

第一步是通过将数量和价格相乘来在内部计算总价格:

CREATE OR REPLACE TRIGGER ORNG_INV_LINE_MULT
BEFORE INSERT OR UPDATE ON ORNG_INV_LINE
FOR EACH ROW
BEGIN 
:NEW.Inv_Line_Total := :NEW.Inv_Line_Price * :NEW.Inv_Line_Quantity;
END ORNG_INV_LINE_MULT;
/

这可以通过行级触发器来完成,因为它会影响行。

第二个语句需要是语句级触发器,否则我会出现突变错误(仍然不确定为什么)

create or replace TRIGGER ORNG_INV_L_TTL_TRIG
AFTER INSERT OR UPDATE OR DELETE ON ORNG_INV_LINE
BEGIN
UPDATE ORNG_INVOICE SET Inv_Amount = (SELECT SUM(Inv_Line_Total) 
FROM ORNG_INV_LINE
WHERE INV_Num = ORNG_INVOICE.INV_Num);
END ORNG_INV_L_TTL_TRIG;
/