【问题标题】:Trigger to update a quantity after deletion删除后触发更新数量
【发布时间】:2014-11-10 04:56:00
【问题描述】:

我正在尝试创建一个名为的触发器,该触发器将在删除相应的产品 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 的值,但这也不起作用。

有什么想法吗?

乔恩

【问题讨论】:

    标签: sql oracle triggers


    【解决方案1】:

    我希望你想要

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

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

    【讨论】:

    • 男人!!!我是如此接近, :old 就是这样做的。我试图在几个地方使用 :new ,只是不明白发生了什么。感觉不对,但我的书并没有很好地解释它。感谢先生的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 2011-05-05
    • 2015-02-13
    • 1970-01-01
    相关资源
    最近更新 更多