首页 > 解决方案 > 用于插入/更新列的触发器在 Oracle 中不起作用

问题描述

trigger在 Oracle 中创建了一个。我想要的是,无论是插入新行还是更新任何现有行,我都希望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:在预期以下情况之一时遇到符号“=”::=。(@%;

标签: oracletriggersinsert-update

解决方案


假设zone_name是表中的一列TBL_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;

推荐阅读