【发布时间】: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 的值,但这也不起作用。
有什么想法吗?
乔恩
【问题讨论】: