Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在pl sql中进行更新触发器查询_Sql_Oracle_Plsql_Oracle11g_Oracle Apex - Fatal编程技术网

如何在pl sql中进行更新触发器查询

如何在pl sql中进行更新触发器查询,sql,oracle,plsql,oracle11g,oracle-apex,Sql,Oracle,Plsql,Oracle11g,Oracle Apex,我有两个表(1)产品仓库和(2)退货供应商发票。 我必须根据退货供应商发票表的值,通过触发器更新产品仓库中的数量。 其中,Item\u code是两个表中的唯一键 例如,如果产品仓库包含3个数量,而店主将1个数量返回给供应商,则产品仓库中的数量应为2个。更新查询也可以接受 create or replace trigger tiuda_return_vendor after insert or update or delete on return_vendor is begin update

我有两个表(1)
产品仓库
和(2)
退货供应商发票
。 我必须根据
退货供应商发票
表的值,通过触发器更新
产品仓库
中的
数量
。 其中,
Item\u code
是两个表中的唯一键

例如,如果产品仓库包含3个数量,而店主将1个数量返回给供应商,则
产品仓库中的数量应为2个。更新查询也可以接受

create or replace trigger tiuda_return_vendor after insert or update or delete
on return_vendor is
begin
  update product_wherehouse
  set
    quantity = quantity - (:new.quantity - nvl(:old.quantity, 0)
  where
    item_code = nvl(:new.item_code, :old.item_code);
end;
这种触发器在大多数情况下都有效。您可以插入、更新或删除返回行

唯一的问题是:在更新时,您不能更新item_代码本身,因为update语句没有考虑到这一点。你可以很容易地解决这个问题,但我不知道这是否符合你的要求。我通常不会这样更改值,而是删除该项并为其他项添加新行


更新数量可以很好地工作。如果您更新数量,将计算新旧之间的差异,该差异用于修改Where House中的库存数量。

解决方案必须使用触发器吗?关于使用触发器读取正在更新的表,有一些规则。是的,解决方案是使用触发器。
create or replace
TRIGGER "WR_RETURN_INVOICE_UPDATE_TRG" 
AFTER UPDATE ON RETURN_INVOICE
FOR EACH ROW
  BEGIN
    UPDATE PRODUCT_WAREHOUSE
    SET QUANTITY=QUANTITY-:OLD.QUANTITY
    WHERE ITEM_CODE=:OLD.ITEM_CODE;   
END WR_RETURN_INVOICE_UPDATE_TRG;



Try this one it will works.