创建一个触发器,在插入,删除或更新行时更新表上的属性

时间:2017-03-09 19:46:44

标签: sql oracle

我有两张桌子

  • 行(inv_number line_num p_code line_units line_price)
  • 产品(P_code P_desit _P_indate P_qoh P_min P_price p_dicount v_code P_min_order P_Reorder

我必须创建一个触发器,它会自动更新产品表中给定产品的属性p_qoh。

因此,每次我从行表中插入,更新或删除行时,它都会减少,更新或增加P_QOH属性。

这是迄今为止我所拥有的一切

create or replace trigger TRG_LINE_PRODUCT
after insert update or delete on TBL_CH08_PRODUCT
for each row
begin 

1 个答案:

答案 0 :(得分:1)

您必须首先了解创建触发器的位置,在这种情况下,目标表是PRODUCT,但是您的软件的逻辑条件告诉我们事件的源表是LINE。

触发器如下所示:

CREATE OR REPLACE Trigger TRG_LINE_PRODUCT
  After Insert Or Update Or Delete On LINE
  Referencing Old As Old New As New
  For Each Row
Declare
Begin
  If inserting Then
    If :New.p_code Is Not Null Then
      Update PRODUCT
      Set    p_qoh = p_qoh + 1
      Where  p_code = :New.p_code;
    End If;
  ElsIf updating Then
    If Nvl(:Old.p_code, 'XyZ@') <> Nvl(:New.p_code, 'XyZ@') Then
      Update PRODUCT
      Set    p_qoh = p_qoh - 1
      Where  p_code = :Old.p_code;    
      Update PRODUCT
      Set    p_qoh = p_qoh + 1
      Where  p_code = :New.p_code;    
    End If;
  ElsIf deleting Then
    If :Old.p_code Is Not Null Then
      Update PRODUCT
      Set    p_qoh = p_qoh - 1
      Where  p_code = :Old.p_code;    
    End If;
  End If;
Exception
  When Others Then
    Null;
End TRG_LINE_PRODUCT;

触发器知道哪个事件&#34;触发&#34;分别有关键字插入,更新和删除。

对于更新的情况,如果将:new和:old数据与此关键字进行比较,则可以使用一个表单来了解列目标是否更改。