Oracle 触发器案例
CREATE OR REPLACE TRIGGER TEST_TRIGGER
AFTER update ON 表
FOR EACH ROW --语句级触发,即每一行触发一次
declare
aname varchar2(20);
id_seq int;
new_httpPort varchar2(5);
media_id int;
BEGIN
new_httpPort := :new.httpserverport;
if (:new.httpserverport = '881') then
new_httpPort := '881\';
end if;
if (:old.evidence_ref is null and :new.evidence_ref is not null) or :old.evidence_ref <> :new.evidence_ref then
select zjipst110.t_evidence_seq.nextval@jb110 into id_seq from dual;
select realname into aname from 用户表 where username=:old.username;
INSERT INTO 表前缀.表名@用户(id,jjdbh,cjdbh,scrxm,wjmc,ftplj,SCSJ,zjlxbh,ZJLXMC,insert_time)
VALUES (id_seq,:new.evidence_ref,:new.cjdbh,aname,substr(:new.ftpserverpath,-19),'http://ip:端口/index.php/MediaFrame/download?id='||:new.MEDIAGROUP,:new.uploaddatetime,'zfjly',substr(:new.ftpserverpath,-3),sysdate); --:old代表旧值
end if;
END;
触发器详解:
触发器名称: TEST_TRIGGER
触发条件: 更新表后
触发级别: 语句级(对每一行数据触发一次)
在Oracle数据库中,触发器是一种特殊的存储过程,它自动在数据库表上执行指定的操作。以下是一个关于如何使用Oracle触发器的案例。
当我们在指定的表上执行更新操作时,这个触发器会自动被激活。对于每一行数据,它都会执行以下操作:
获取新值 new.httpserverport,并检查是否等于’881’。如果是,则将其设置为’881’。
检查old.evidence_ref和new.evidence_ref的值。如果旧值是null而新值不是null,或者两者的值不相等,则执行以下操作:a. 从序列 表前缀.序列名称.nextval@用户 获取下一个值,并将其存储在变量id_seq中。
b.从用户表中选择与旧值:old.username匹配的realname,并将其存储在变量aname中。
c.向zjipst110.T_EVIDENCE@jb110表中插入一行数据,包括从序列获取的ID、:new.evidence_ref、:new.cjdbh、aname、:new.ftpserverpath的最后19个字符、以及由URL和:new.MEDIAGROUP组成的下载链接等其他字段的值。
通过这种方式,我们可以利用Oracle触发器在数据表更新时自动执行某些操作,从而简化数据库操作和提高数据一致性。