删除后触发更新数量

时间:2014-11-09 20:49:18

标签: sql oracle triggers

我正在尝试创建一个名为触发器,当相应的产品LINE行被删除时,该触发器将自动更新产品的库存产品数量。我没有问题创建可以在插入或更新后更新相同值的触发器,但由于某种原因,这让我感到困惑。

这是我到目前为止所做的:

CREATE OR REPLACE TRIGGER UPDATE_DELETE
AFTER DELETE ON LINE
FOR EACH ROW
BEGIN  
    UPDATE PRODUCT
    SET P_QOH = P_QOH + 
    (SELECT LINE_UNITS 
    FROM LINE
    WHERE LINE.P_CODE = PRODUCT.P_CODE)
    WHERE PRODUCT.P_CODE = :NEW.P_CODE;

DBMS_OUTPUT.PUT_LINE('Product QOH updated');
END;
/

我要做的就是将当前在LINE_UNITS中的值传递给要删除的行,并将其添加到PRODUCT表中的P_QOH,以便在删除后反映正确的QOH。我尝试了几种不同的方法,但到目前为止,没有运气。当我尝试删除一行时,我收到一条错误消息:

  

触发器(或用户定义的plsql函数,在中引用)              这句话)试图查看(或修改)一个表              在被解雇它的声明修改的过程中。   *动作:重写触发器(或函数),使其不读取该表。

这是我尝试这样做的另一种方式:

CREATE OR REPLACE TRIGGER UPDATE_DELETE
AFTER DELETE ON LINE
FOR EACH ROW
BEGIN
    UPDATE PRODUCT
    SET P_QOH = P_QOH + LINE_UNITS
    WHERE PRODUCT.P_CODE = :NEW.P_CODE;

DBMS_OUTPUT.PUT_LINE('Product QOH updated');
END;
/

这给了我一个错误,说LINE_UNITS是一个无效的标识符 - 我假设是因为LINE_UNITS不是PRODUCT表的一部分。我也尝试过LINE.LINE_UNITS,但没有用。

我也试过声明一个变量,将变量设置为LINE_UNITS的值,但这也不起作用。

有什么想法吗?

乔恩

1 个答案:

答案 0 :(得分:1)

我希望你想要

UPDATE PRODUCT
   SET P_QOH = P_QOH + :OLD.line_units
 WHERE PRODUCT.P_CODE = :OLD.P_CODE;

在删除的行级触发器中,:old伪记录包含删除操作之前的行数据。 :new伪记录将充满NULL值(就像:old伪记录在行级插入触发器中充满NULL值一样。)

相关问题