逻辑描述:
触发器逻辑,判断sys_user表uuid字段,是否关联了base表的uuid,如果关联了,则触发根据身份证号修改base表生日和性别。
SQL代码:
create or replace TRIGGER "TR_SYSUSER_ZJHM"
after update on sys_user
for each row
begin
if :new.db_uuid is not null then
--因为触发器查找不到正在更新的表内容 即无法在里边使用select sys_user的情况 所以只能for each row得每行比对:new.字段来进行更新
if length(:new.zjhm)=18 then
update xydb_base b set
b.xbm = decode(mod(to_number(substr(:new.zjhm, 17, 1)), 2),0,'2','1'),
b.csrq = to_char(to_date(substr(:new.zjhm, 7, 8), 'yyyy-MM-dd'),'yyyy-MM-dd'),
b.xb = decode(mod(to_number(substr(:new.zjhm, 17, 1)), 2),0,'女','男')
where b.uuid = :new.db_uuid;
end if;
end if;
end;
笔记总结:
中间卡了一下,遇到的问题是:在begin end语句段里一直报错,报错内容是‘表xx 发生了变化, 触发器/函数不能读它’
错误代码截图:红框里的是错误写法,正确的写法应该是注释那三段,即文章开头的代码段
后来仔细一想,既然sys_user表正在被触发器执行,那就读不到该表了,语法也提供了:new和:old两个状态参数来以供使用,所以改变思路直接取:new.字段来进行更新。
参考链接:
Oracle触发器详解:http://t.csdn.cn/RRAil
Oracle根据身份证号码判断性别,年龄:http://t.csdn.cn/CzwfG