最近工作中需要写触发器,临时上网搜索了一下关于Oracle触发器的相关资料,其最基本定义格式如下:
语法规则:
Before| after insert|delete|(update of 列名)
On 表名
[for each row]
When 条件
PL/SQL块
说明:
For each row的意义是:在一次操作表的语句中,每操作成功一行就会触发一次;不写的话,表示是表级触发器,则无论操作多少行,都只触发一次;
When条件的出现说明了,在DML操作的时候也许一定会触发触发器,但是触发器不一定会做实际的工作,比如when 后的条件不为真的时候,触发器只是简单地跳过了PL/SQL块;
关于触发器分类可以从上面的语法规则中看出,触发器可以针对数据库中不同的操作(一般为增删改操作),以及通过关键字before和after来确定法类型。
关键字:
:NEW 和:OLD使用方法和意义,new 只出现在insert和update时,old只出现在update和delete时。在insert时new表示新插入的行数据,update时new表示要替换的新数据、old表示要被更改的原来的数据行,delete时old表示要被删除的数据。
注意:
在触发器中不能使用commit。但是有一种情况除外,可以加入自治事务(需要在触发器中加入
PRAGMA AUTONOMOUS_TRANSACTION;
)
实例代码如下:
create or replace trigger TRG_TsSign_Filter
before insert On ts_sign REFERENCING NEW AS NEW FOR EACH ROW
/**
* author T410
* 说明:
该触发器是作用于表ts_sign在插入操作之前对新增的记录行作过滤(根据其状态位为5作为条件),并予以审核(即将其状态改为2(审核通过))
*/
--根据其状态字段是否为5判断,若为5则表示是用户通过手机新发送的手机签名
when (NEW.status = 5)
DECLARE
--敏感词汇长度
lengths integer :=0;
--敏感词汇
keyword varchar2(100);
--替代敏感词汇的*集合
substiotionWord varchar2(100) := '';
--构造敏感词汇替代的*集合时在for循环中用到的计数器
counter number := 0;
--插入行记录的内容字段
content varchar2(200) :=:NEW.CONTENT;
--用户签名使用表中当前最大ID
maxid number := 0;
--新插入记录行ID字段
newId number :=:NEW.id;
--新插入记录行手机号码
phoneNumber varchar2(30) :=:NEW.CREATEPHONE;
-- PRAGMA AUTONOMOUS_TRANSACTION;
--PL/SQL块开始
begin
--for循环开始,遍历敏感词汇表td_sensitivemsg
for fw in (select content from td_sensitivemsg s) loop
--进入循环体,将替换词重置为''
substiotionWord := '';
--判断敏感词汇表中的敏感词内容是否为空,若为空则执行以下PL/SQL块
--if开始
if fw.content is not null then
-- 过滤关键字赋值
keyword := fw.content;
-- 关键字长度
lengths := length(keyword);
--for循环,利用关键字长度构造替代的*集合
--for循环开始
for counter in 1..lengths loop
substiotionWord := substiotionWord || '*';
end loop;
--for循环结束
--content内容替换
select replace(content,keyword,substiotionWord) into content from dual;
--将插入行NEW的content字段替换为过滤后的内容
:NEW.content := content;
--同时将插入行的状态修改为2(表示已经审核通过)
:NEW.status := '2';
select max(to_number(id)) into maxid from ts_user_sign;
end if;
--if结束
end loop;
--for循环结束
/* 暂时将此功能屏蔽,不针对ts_user_sign表做任何操作
-- 在更新完ts_sign表之后,需要将该记录插入ts_user_sign
insert into ts_user_sign(id,signid,phone,defaultornot,createdate) values(maxid+1,newId,phoneNumber,'1',sysdate);
*/
end;
--PL/SQL块结束
196

被折叠的 条评论
为什么被折叠?



