我正在尝试创建一个名为触发器,当相应的产品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的值,但这也不起作用。
有什么想法吗?
乔恩
答案 0 :(得分:1)
我希望你想要
UPDATE PRODUCT
SET P_QOH = P_QOH + :OLD.line_units
WHERE PRODUCT.P_CODE = :OLD.P_CODE;
在删除的行级触发器中,:old
伪记录包含删除操作之前的行数据。 :new
伪记录将充满NULL值(就像:old
伪记录在行级插入触发器中充满NULL值一样。)