需求:对表每插入一条数据 zjsl这个字段就同时根据 字段名含有zsmc的值是否为空 的数量 来重新更新 zjsl 的值
(如:zsmc1 zsmc2 zsmc3 zsmc4 就表示了这个表里面的每个人最多有四本证书,由于证书数量可能会随时变化 所以字段 也会随着变化 因此 判断zsmc1 至 zsmc 4 is null 来判断就不可取 所以此时的字段就为动态)
思路:如果使用自治事务处理 但是如果 使用自治事务处理 不能更新触发器 所在的行
因此采用多个触发器交互使用 并定义全局变量 保证每次插入后都会即使更新当前行
--行级触发器
create or replace TRIGGER fbdw_info_trigger
before insert on fbdw_info
for each row
declare
--pragma autonomous_transaction;
begin
fbdw_qjlb_package.fbdwid:=:new.wyid; --程序包中的变量
fbdw_qjlb_package.fbdwryxm:=:new.ryxm;
--commit;
end;
--程序包定义全局变量
create or replace package fbdw_qjlb_package
is
fbdwid fbdw_info.wyid%type;
fbdwryxm fbdw_info.ryxm%type;
end fbdw_qjlb_package;
--语句级触发器
create or replace trigger fbdw_info_tb_trigger
after insert on fbdw_info
declare
pragma autonomous_transaction;
zd varchar2(1000);
num number;
begin
--将此表所有包含zsmc的列取出来并组装成 如:decode(zsmc1,null,null,1)也就是 如果为空撒都不显示 如果有就显示1 主要是为了后来好判断zjsl;
select replace(wm_concat('decode('||COLUMN_NAME||',null,null,1)'),'),',')||') into zd from
user_col_comments where Table_Name='FBDW_INFO' and COLUMN_NAME like 'ZSMC%';
--在执行动态sql语句 判断字符串长度 字符串长度就表示有基本证书
execute immediate 'select nvl(length('||zd||'),0) from FBDW_INFO where wyid='''||fbdw_qjlb_package.fbdwid||''' and ryxm='''||fbdw_qjlb_package.fbdwryxm||'''' into num;
--在执行动态sql语句 将zjsl重新更新
execute immediate 'update fbdw_info set zjsl='||num||' where wyid='''||fbdw_qjlb_package.fbdwid||''' and ryxm='''||fbdw_qjlb_package.fbdwryxm||''' ';
insert into aaa values(num,'update fbdw_info set zjsl='||num||' where wyid='''||fbdw_qjlb_package.fbdwid||''' and ryxm='''||fbdw_qjlb_package.fbdwryxm||''' ');
commit;
end;