背景:
有一类轨迹数据来源于第三方接口,但接口推送的数据差一个轨迹描述字段(即对该条活动轨迹数据的各个字段拼接一下作为描述),叫双方研发重新改接口太浪费时间,所以想到利用触发器来解决,之前没写过触发器,于是现学现用,顺便做个笔记
触发器语法
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER }
{INSERT | DELETE | UPDATE [OF column [, column …]]}
[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]
ON [schema.]table_name | [schema.]view_name
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
PL/SQL_BLOCK | CALL procedure_name;
语法解释:
trigger_name:触发器名称
before | after : 指定触发器是在触发事件发生之前触发还暗示发生之后触发
trigger_event:触发事件,在DML触发器中主要为insert、update、delete等
table_name:表名,表示发生触发器作用的对象
for each row:指定创建的是行级触发器,若没有该子句则创建的是语句级触发器
when trigger_condition:添加的触发条件
trigger_body:触发体,是标准的PL/SQL语句块
create or replace trigger RYGL_YSCLKK_INSERT_HDXXMS --创建或更新触发器RYGL_YSCLKK_INSERT_HDXXMS
before insert --插入前触发
on t_ry_gjxx --作用在t_ry_gjxx表
for each row --行级触发
declare
xming varchar2(50); --创建一个变量,因为对面没传了身份证没传名字,所以后续得去查名字赋值给这个变量
begin --开始
if :new.dtxxlx='YSCLKK' and :new.gjtszt='2' and :new.sfzh !='000000000000000000' and :new.hdfssj>'20191230000001' then --判断是否为借口推送数据且身份证是否是正常身份证号码
select xm into xming from t_ry_jbxx where sfzh=:new.sfzh; 利用接口传过来的身份证去本地数据库查询姓名并赋值给xming变量
:new.hdxxms:='您布控的车牌:'||substr(:new.bzhm,8,7)||'(姓名:'||xming||',身份证:'||:new.sfzh||')于'||to_char(to_date(:new.hdfssj,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss')||'通过'||:new.fsdshcs; --拼接活动描述字符串并赋值给hdxxms字段
:new.gjtszt:='0'; --将0赋值给gjtszt字段
:new.rksj:=sysdate; --将当前时间赋值给rksj字段
end if; --结束
end; --结束
小记:
select 字段名 into 变量 from 表/视图 where 条件 表示将某个查询结果赋值给变量
:new表示操作完成后的值
:=表示赋值
例如:
:new.rksj:=sysdate; 表示将当前时间赋值给rksj字段,注意是冒号+等号,单个等号是等职计算