oracle - 用于插入/更新列的触发器在 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:在预期以下情况之一时遇到符号“=”::=。(@%;
解决方案
假设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;
推荐阅读
- scala - 如何在 Scala 数据框中获取文件的创建日期
- mysql - MySQL 对最新数据的可重复读取保证
- c++ - Unreal 4.24:在Delegate回调方法中给TMap添加值会导致编辑器崩溃
- python - 无法转换类型的对象
到张量。内容:(维度(100),1)。考虑将元素转换为支持的类型 - port - 如何让 Apache Zeppelin/Shiro 在不同的端口(不是 8080)上工作?
- python - Pandas:将小时添加到时区感知索引
- javascript - jQuery 隐藏/显示只是瞬时的,我怎样才能让它们与我的轮播一起过渡?
- git - 如何使用子树将项目克隆到现有目录
- python - 我们可以使用没有目标变量的聚类吗?
- ruby-on-rails - 如何使用 ruby 在 Google big Query 中设置/更新表的过期时间