如何将以下过程更改为“替代触发器”?

时间:2011-03-06 05:30:31

标签: sql oracle stored-procedures triggers

CREATE or REPLACE PROCEDURE UPDATE_SUBTOTAL is

v_order_no orderline.order_no%type;

v_subtotal   number(15); 

CURSOR product_orderline_cur is

SELECT ol.order_no, sum(p.unit_price * ol.qty) as subtotal

from product p, orderline ol

where p.product_no = ol.product_no

group by ol.order_no;

BEGIN

OPEN product_orderline_cur;

LOOP

    FETCH product_orderline_cur into v_order_no, v_subtotal;

    EXIT when product_orderline_cur%notfound;

    -- store subtotal in orders table

    UPDATE orders

    SET subtotal = v_subtotal  

    WHERE order_no = v_order_no;

END LOOP;

--an order may be created but no orderlines added yet,insert a 0

UPDATE orders

SET subtotal = 0

WHERE subtotal is null;

CLOSE product_orderline_cur;

END;

/
show errors;

1 个答案:

答案 0 :(得分:0)

CREATE OR REPLACE TRIGGER orders_before_update
BEFORE UPDATE ON orders
    FOR EACH ROW

DECLARE v_sum INT;

BEGIN

    SELECT SUM(p.unit_price * ol.qty)
    INTO v_sum
    FROM product p INNER JOIN orderline ol
      ON p.product_no = ol.product_no
    WHERE ol.order_no = :new.order_no;

    :new.subtotal := COALESCE(v_sum, 0);
END;