oracle触发器 insert 里 字段名 引用变量

需求:对表每插入一条数据  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;

你可能感兴趣的:(oracle触发器 insert 里 字段名 引用变量)