行不存在时更新触发器

Posted

技术标签:

【中文标题】行不存在时更新触发器【英文标题】:Update trigger when row doesn't exist 【发布时间】:2013-08-26 08:28:01 【问题描述】:

我有两张桌子 订单项:

"ORDER_ITEMS_CODE" VARCHAR2(20) NOT NULL ENABLE, 
"ORDER_CODE" VARCHAR2(20) NOT NULL ENABLE, 
"ITEM_CODE_ORDERS" VARCHAR2(20) NOT NULL ENABLE, 
"ORDER_QUANTITY" NUMBER(4,0) NOT NULL ENABLE, 
"ORDER_UNIT" VARCHAR2(5) NOT NULL ENABLE, 
"UNIT_PRICE" NUMBER(38,5), 
"ORDERED_IN" VARCHAR2(6), 
"OR_QUANTITY_TON" NUMBER(38,5),
"Warehouse_CODE" VARCHAR2(20) NOT NULL ENABLE

另一个表是Inventory:

"INVENTORY_CODE" VARCHAR2(20) NOT NULL ENABLE, 
"ITEM_CODE" VARCHAR2(20) NOT NULL ENABLE, 
"WAREHOUSE_CODE" VARCHAR2(20),  
"IN_Q_TON" NUMBER(38,5), 
"OR_Q_TON" NUMBER(38,5) 

我创建了一个触发器来计算 "OR_QUANTITY_TON" = Sum ("OR_QN_TON")

create or replace trigger sum_Or_IT
after insert or update or delete on orderitems
begin
    update INVENTORY set OR_Q_TON = (
        select sum(or_quantity_ton) from orderitems 
        where
        orderitems.item_code_orders = INVENTORY.item_code
        and
        warehouse_code = '1');
end;

这是一个库存表,列 OR_Q_TON 是每个项目的订购数量的总和,但是如果订单中不存在某个项目,我希望订单数量为零。 如果表“Orderitems”中不存在“item_code_orders”,我想例外,那么 OR_Q_TON = 0

我试过了,但没用我得到 (-) 不是 (0)

EXCEPTION
  WHEN NO_DATA_FOUND THEN
    update INVENTORY set OR_Q_TON = 0 ;

【问题讨论】:

【参考方案1】:

它也不例外,在上述更新的情况下,AND oracle 不会引发异常 你需要使用sql%rowcount

试一试:

IF SQL%ROWCOUNT = 0 THEN
  update INVENTORY set OR_Q_TON = 0 ;
END IF;

【讨论】:

我试过这个但我没有得到 (0) ,,, 这是一个库存表,列 OR_Q_TON 是每个项目的订购数量的总和,但是如果一个项目没有t 存在于订单中,,我希望订单数量为零。【参考方案2】:

您可以使用它来代替使用 EXCEPTION,

IF SQL%NOTFOUND THEN 
    UPDATE inventory SET or_q_ton = 0 ;
    COMMIT;
END IF;

【讨论】:

触发器编译没有错误,但我也得到 (-) 而不是 (0) 可能你错过了什么。你能发布你修改过的代码吗? create or replace trigger sum_Or_IT after insert or update or delete on orderitems begin update INVENTORY set OR_Q_TON = ( select sum(or_quantity_ton) from orderitems where orderitems.item_code_orders = INVENTORY.item_code and warehouse_code = '1'); IF SQL%NOTFOUND THEN UPDATE inventory SET or_q_ton = 0 ; COMMIT; END IF; end;​ 测试了您的查询并且运行良好。检查您的表 orderitems 并使用 (werehouse_code = '1') 检查数据是否存在。 inventory 表中的warehouse_code =1 但在orderitems 表中整行不存在,因此没有warehouse_code!【参考方案3】:

触发器应该是

create or replace trigger sum_Or_IT
after insert or update or delete  on orderitems
begin
    update INVENTORY set OR_Q_TON = (
        select coalesce(sum(or_quantity_ton),0) from orderitems 
        where
        orderitems.item_code_orders = INVENTORY.item_code
        and
        warehouse_code = '1')        
end;

使用合并函数而不是异常解决的问题

【讨论】:

以上是关于行不存在时更新触发器的主要内容,如果未能解决你的问题,请参考以下文章

如果表中的行不存在,我如何更新或插入它?

mysql关于触发器怎么判断数据存在时更新不存在时添加呢!

当行不存在时,“SELECT FOR UPDATE”是不是会阻止其他连接插入?

仅当行不存在时才插入 SQL

仅当行不存在时,如何在 SQL Server 中执行插入操作? [复制]

仅当行不存在时才附加到 csv