【问题标题】:Trigger for inserting/updating columns is not working in Oracle用于插入/更新列的触发器在 Oracle 中不起作用
【发布时间】:2021-08-05 17:43:37
【问题描述】:

我在 Oracle 中创建了一个trigger。我想要的是,无论是插入新行还是更新任何现有行,我想分别根据某些条件 Insert/Update 特定列。

下面是我的触发器,但它给了我一些错误。

create or replace TRIGGER TRG_UPD_RRSOC_ZONAL_NAME
BEFORE UPDATE ON TBL_RRSOC_STORE_INFO
FOR EACH ROW
 BEGIN      
 IF NEW.SLP_ZONAL_HEAD_NAME = 'ABC' then ZONE_NAME = 'North';
 IF NEW.SLP_ZONAL_HEAD_NAME = 'XYZ 'then ZONE_NAME = 'South';
END;

出了什么问题,因为我收到以下错误:

错误(4,48):PLS-00103:在预期以下之一时遇到符号“=”::=。 (@%;

【问题讨论】:

  • 您需要引用带有前导冒号的:new 伪记录。我不确定您的IF 声明应该是什么意思——您没有将:new.slp_zonal_head_name 与任何东西进行比较。假设您的意图是为:new.zone_name 分配一个值,您将使用:= 运算符进行分配。 = 运算符用于比较。
  • @JustinCave:我想要的是,每当更新现有行时,我都想更新:new.zone_name。我添加了IF,因为我还有 2-3 个条件。请查看我更新的问题

标签: oracle triggers insert-update


【解决方案1】:

假设zone_nameTBL_RRSOC_STORE_INFO 表中的一列,听起来你想要这样的东西。请注意

  • :new 伪记录的引用需要以冒号: 为前缀,
  • 赋值运算符是:= 而不是=
  • 如果您想更改zone_name 列的值,您需要为:new.zone_name 赋值
  • IF 语句需要END IF。您也可以使用 ELSIF 分支,而不是重复 `IF 语句。

所以触发器主体应该是这样的

BEGIN      
 IF :NEW.SLP_ZONAL_HEAD_NAME = 'ABC' then :new.ZONE_NAME := 'North'; end if;
 IF :NEW.SLP_ZONAL_HEAD_NAME = 'XYZ' then :new.ZONE_NAME := 'South'; end if;
END;

或者更简洁,使用case 语句而不是一系列IF 语句

BEGIN
  :new.zone_name := case :NEW.SLP_ZONAL_HEAD_NAME
                         when 'ABC' then 'North'
                         when 'XYZ' then 'South'
                      end;
END;

【讨论】:

  • 感谢贾斯汀的及时回答,再问一个问题。我想为 INSERTUPDATE 实现这一点
  • @hud - 好的。然后将触发器定义为在INSERT OR UPDATE 而不是UPDATE 上触发。
  • 是的.. 像这样添加BEFORE INSERT OR UPDATE ON TBL_RRSOC_STORE_INFO
猜你喜欢
  • 2021-07-31
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 2011-03-16
  • 1970-01-01
相关资源
最近更新 更多