记录那些删除的伴我成长的触发器

1,ADDCSUTSAME

create or replace trigger ADDCSUTSAME
  before insert on bd_cubasdoc
  for each row
declare
  -- local variables here
  pk_bas  varchar2(200);
  cursor basjob(id varchar2)is
  select custname from bd_cubasdoc
  where custname=id
  and nvl(dr,0)=0
  /*and custname in (select custname from bd_cubasdoc)
  and length(custname)>3*/;
begin
 open basjob(:new.custname) ;
 loop
   fetch basjob
   into pk_bas;
  exit when basjob%notfound;
  end loop;
   close basjob;
  if pk_bas is not null then
    begin
      raise_application_error(-20001,pk_bas||'客商名称重复,请直接修改已存在客商增行!');
      end;
      end if;
end ADDCSUTSAME;

优化v

create or replace trigger ADDC3
  before insert on bd_cubasdoc
  for each row
declare
  -- local variables here
  i number(1);
begin
 select count(1)into i from bd_cubasdoc
where custname=:new.custname or
      (engname=:new.engname and length(:new.engname)>3) or
      (taxpayerid=:new.taxpayerid and length(:new.taxpayerid)>3);  
  if i>0 or
    regexp_like(:new.custname,'[[:space:]]') 
     then
    begin
      raise_application_error(-20001,'客商已存在或有空格,请在已有客商修改增行!');
      end;
  
      end if;
   
end;

2,ADDCUST1A

create or replace trigger ADDCUST1A
  before INSERT or UPDATE on  BD_CUBASDOC 
  for each row
declare
  -- local variables here
begin
  IF regexp_like(:new.custname,'[[:xdigit:]]') or
    regexp_like(:new.custname,'[[:space:]]') 
     then
     raise_application_error(-20001,'注意:客商不能重复,请在原有客商增行!');
 end if;    

end ;

3,CSpcace_ACCBANK

create or replace trigger CSpcace_ACCBANK
before insert or update on bd_accbank  
  for each row
declare
  -- local variables here
  pk_bas bd_accbank.pk_accbank%type;
 cursor basjob(id varchar2) is 
 select pk_accbank from ncv5.bd_cubasdoc,ncv5.arap_djfb,ncv5.bd_cumandoc,ncv5.bd_accbank

        where ncv5.arap_djfb.ksbm_cl = ncv5.bd_cumandoc.pk_cumandoc
         and ncv5.bd_cumandoc.pk_cubasdoc = ncv5.bd_cubasdoc.pk_cubasdoc
         and ncv5.bd_accbank.pk_accbank = ncv5.arap_djfb.skyhzh
         and ncv5.arap_djfb.payflag in ('1', '2')
 and pk_accbank=id;
 
 
 
begin
 open basjob(:new.pk_accbank);
 loop
   fetch basjob into pk_bas;
   exit when basjob%notfound;
   end loop;
   close basjob;
   
 if regexp_like(:new.bankacc,'[[:space:]]') or
    regexp_like(:new.combineaccnum,'[[:space:]]') or
    regexp_like(:new.unitname,'[[:space:]]') or
   pk_bas is not null
     then
    raise_application_error(-20001,'银行账号、联行号、单位名称中有空格或账号已从网银成功付款!');
  
end if;
end;

优化v-1

create or replace trigger C_ACCBANK_SPACE
before insert or update on bd_accbank  
  for each row
declare
  -- local variables here
  
begin 
 if regexp_like(:new.bankacc,'[[:space:]]') or
    regexp_like(:new.combineaccnum,'[[:space:]]') or
    regexp_like(:new.unitname,'[[:space:]]') 
     then
    raise_application_error(-20001,'注意:银行账号、联行号或单位名称中有空格!');
 end if;    
end ;

优化v-2

create or replace trigger C_ACCBANK_NET
  before UPDATE on   BD_ACCBANK
  for each row
declare
  -- local variables here
  pk_bas bd_accbank.pk_accbank%type;
     
 cursor basjob(id varchar2) is 
 select pk_accbank from ncv5.bd_cubasdoc,ncv5.arap_djfb,ncv5.bd_cumandoc,ncv5.bd_accbank
        where ncv5.arap_djfb.ksbm_cl = ncv5.bd_cumandoc.pk_cumandoc
         and ncv5.bd_cumandoc.pk_cubasdoc = ncv5.bd_cubasdoc.pk_cubasdoc
         and ncv5.bd_accbank.pk_accbank = ncv5.arap_djfb.skyhzh
         and ncv5.arap_djfb.payflag in ('1', '2')
         and pk_accbank=id; 
 
begin
 open basjob(:new.pk_accbank);
 loop
   fetch basjob into pk_bas;
   exit when basjob%notfound;
   end loop;
   close basjob;
 if pk_bas is not null then
  /* if :new.bankacc<>:old.bankacc or
     :new.unitname<>:old.unitname*/
    if utl_match.edit_distance_similarity(:old.bankacc,:new.bankacc)<'90' or
       utl_match.edit_distance_similarity(:old.unitname,:new.unitname)<'70'
     then
   raise_application_error(-20001,'注意:账户已成功付款,不能修改账号或单位名称!');
   end if;
   end if;
end;

4,delbd_custbank

create or replace trigger delbd_custbank

  before delete on bd_custbank

  for each row

declare

  -- local variables here

  pk_bas char(20);

  cursor basjob(id char) is

    select pk_custbank

      from ncv5.bd_custbank /*目标数据库表*/

     where pk_custbank = id

       and nvl(dr, 0) = 0
        and pk_custbank not in
       (select bd_custbank.pk_custbank from ncv5.arap_djfb, ncv5.bd_accbank,ncv5.bd_custbank
where bd_accbank.pk_accbank = arap_djfb.skyhzh
and  bd_accbank.pk_accbank=bd_custbank.pk_accbank);

begin

  /*判断数据是否在目标数据库存在*/

  open basjob(:old.pk_custbank);

  loop

    fetch basjob

      into pk_bas;
      /*dbms_output.put_line('pa_bas:'||pk_bas);*/
    exit when basjob%notfound;

  end loop;

  close basjob;

  /******************************/

  if pk_bas is not null then

    begin

      delete ncv5.bd_custbank /*目标数据库表*/

      where pk_custbank = :old.pk_custbank;

    end;

  end if;

end delbd_custbank;

5,delbd_custbanknet

create or replace trigger delbd_custbanknet
   before delete or update on bd_custbank
  for each row
declare
  -- local variables here
  pk_bas char(20);
  cursor basjob(id char) is
    select pk_custbank
      from ncv5.bd_custbank /*目标数据库表*/
     where pk_custbank = id
       and nvl(dr, 0) = 0
       and pk_custbank in
       (select bd_custbank.pk_custbank from ncv5.arap_djfb, ncv5.bd_accbank,ncv5.bd_custbank
where bd_accbank.pk_accbank = arap_djfb.skyhzh
and  bd_accbank.pk_accbank=bd_custbank.pk_accbank);
begin
  /*判断数据是否在目标数据库存在*/
  open basjob(:old.pk_custbank);
  loop
    fetch basjob
      into pk_bas;
    exit when basjob%notfound;
  end loop;
  close basjob;
  /******************************/

  if pk_bas is not null then
    begin
       raise_application_error(-20001, :old.account||'已从网银付款,不能修改或删行,请取消!');
    end;
  end if;
end delbd_custbanknet;

4,5优化v

create or replace trigger S_DELETE_CUSTBANK

  before delete on bd_custbank

  for each row

declare

  -- local variables here

  pk_bas char(20);

  cursor basjob(id char) is
  
    select pk_custbank
    
      from ncv5.bd_custbank /*目标数据库表*/
    
     where pk_custbank = id
          
       and nvl(dr, 0) = 0
       and pk_custbank not in
           (select bd_custbank.pk_custbank
              from ncv5.arap_djfb, ncv5.bd_accbank, ncv5.bd_custbank
             where bd_accbank.pk_accbank = arap_djfb.skyhzh
               and bd_accbank.pk_accbank = bd_custbank.pk_accbank);

begin

  /*判断数据是否在目标数据库存在*/

  open basjob(:old.pk_custbank);

  loop
  
    fetch basjob
    
      into pk_bas;
    /*dbms_output.put_line('pa_bas:'||pk_bas);*/
    exit when basjob%notfound;
  
  end loop;

  close basjob;

  /******************************/

  if pk_bas is not null then
  
    begin
    
      delete ncv5.bd_custbank /*目标数据库表*/
      
       where pk_custbank = :old.pk_custbank;
    
    end;
  else
    raise_application_error(-20001,
                            :old.account || '已从网银付款,不能修改或删行,请取消!');
  
  end if;
end S_DELETE_CUSTBANK;

6,UPDCUSTNET

create or replace trigger UPDCUSTNET

  before update on bd_cubasdoc

  for each row

declare

  -- local variables here

   pk_bas char(20);

   pk_custname varchar2(200);

  /*查询目标公司是否存在基本档案*/

  cursor basjob(id char) is

    select pk_cubasdoc,custname

      from ncv5.bd_cubasdoc /*目标数据库表*/

       where pk_cubasdoc = id

       and nvl(dr, 0) = 0

       and  pk_cubasdoc  in

       (select bd_cubasdoc.pk_cubasdoc from ncv5.bd_cubasdoc,ncv5.arap_djfb,ncv5.bd_cumandoc

        where arap_djfb.ksbm_cl = bd_cumandoc.pk_cumandoc

         and bd_cumandoc.pk_cubasdoc = bd_cubasdoc.pk_cubasdoc
         and arap_djfb.payflag in ('1', '2'));

begin

   open basjob(:new.pk_cubasdoc);

  loop
    fetch basjob
      into pk_bas,pk_custname;

    exit when basjob%notfound;

  end loop;

  close basjob;

  --raise_application_error(-20001,:new.pk_cubasdoc);

  --raise_application_error(-20001,:new.custname);

  --raise_application_error(-20001,pk_custname);

  --dbms_output.put_line(:new.pk_cubasdoc);

  if pk_bas is not null  then

    if  utl_match.edit_distance_similarity(pk_custname,:new.custname)<'50' then

    begin

      raise_application_error(-20001,pk_custname||'已从网银付款,且支付状态为‘支付成功’或‘支付中’,不能修改名称,请取消!(若实际支付失败或退回,请联系集团进行更改)');

    end;
    end if;
  end if;
end UPDCUSTNET;

优化v:

create or replace trigger UPDCUSTALL
  before update on bd_cubasdoc
  for each row

declare
  netpk number(1);
begin
  --将从网银付款客商写入变量netname
  select count(distinct pk_cubasdoc) 
    into netpk
    from ncv5.arap_djfb, ncv5.bd_cumandoc
   where arap_djfb.ksbm_cl = bd_cumandoc.pk_cumandoc
     and bd_cumandoc.pk_cubasdoc = :new.pk_cubasdoc
     and arap_djfb.payflag in ('1', '2');

  --找到已从网银付款客商   
  if netpk >'0' then
    if utl_match.edit_distance_similarity(:old.custname, :new.custname) < '70' then
      raise_application_error(-20001, '已成功付款,不可任意修改');
    end if;
    --没有从网银付款客商
  else
    if utl_match.edit_distance_similarity(:old.custname, :new.custname) < '50' then
      raise_application_error(-20001, '不可任意修改,请新增客商');
    end if;
  
  end if;
end;
原文地址:https://www.cnblogs.com/sumsen/p/2799228.html