oracle使用脚本修改数据,所有中文字“项”前的数字加上括号

oracle使用脚本修改数据,所有中文字“项”前到“第”的数字加上括号

需求:数据库有张表sys_codewfdm里面wfgd与fltw两个字段,存在“第十一项”等情况,需改为“第(十一)项”,(就是加括号,前提是前面有“第”和“项”两个字)
实现:两个字段分两个游标循环,查出一个字段最多“项”的个数,在游标中再次循环。内循环依次处理多个“项”的情况,主要找出“项”“第”的位置,再加括号拼接。

就用到oracle的游标、instr()、substr(),一共三个简单吧,最多加个循环loop。

下面补充instr()用法,老忘

instr函数语法规则:instr(srcStr,targetStr ,[start_position],[num])

srcStr: 源字符串

targetStr :目标字符串

start_position:源字符串中开始的位置,默认从头开始。 【可选参数】

num:目标字符串在 源字符串 中出现的次数,默认第一次。 【可选参数】


完整脚本,以下

declare
  v_index1 number(4); --项 的位置
  v_index2 number(4); --第 的位置
  v_wfgd   varchar2(255);
  v_fltw  varchar2(255);
  cursor cur_A is
    select wfxw, glbm, regexp_count(wfgd, '项') as countNum
      from sys_codewfdm
     where regexp_count(wfgd, '项')>0 and instr(wfgd,'(')=0 and instr(wfgd,')')=0 ;   --已有括号与项md排除
     
  cursor cur_C is
    select wfxw, glbm, regexp_count(fltw, '项') as countNum
      from sys_codewfdm
     where regexp_count(fltw, '项') > 0 and  instr(fltw,'(')=0 and  instr(fltw,')')=0;
begin
  for a in cur_A loop
  dbms_output.put_line(a.wfxw);   --输出查看
    for b in 1 .. 4 loop --最多有4个项,根据实际情况
    
      if a.countNum >= b then
      
        select instr(wfgd, '项', 1, b), wfgd                           //根据b先找到第一个'项'的位置坐标  和第一个要修改字段的内容
          into v_index1, v_wfgd
          from sys_codewfdm s
         where s.wfxw = a.wfxw
           and s.glbm = a.glbm;
      
        select instr(substr(v_wfgd, 0, v_index1), '第', -1)            //先截取再找'第'的位置 是因为根据'项'的位置截取后 -1永远取最后一个'第'的位置 防止你取到其他'第'字的位置  
          into v_index2
          from dual d;
      
        update sys_codewfdm s
           set wfgd = substr(v_wfgd, 0, v_index2) || '(' ||
                      substr(v_wfgd, v_index2 + 1, v_index1 - v_index2 - 1) || ')' ||                      //这里拼接字符 没什么好说的
                      substr(v_wfgd, v_index1)
         where s.wfxw = a.wfxw and s.glbm=a.glbm;
      end if;
    end loop;
  end loop;
  
  //下面这个loop 同上
  
  for c in cur_C loop
  
    for b in 1 .. 3 loop --最多有3个项
    
      if c.countNum >= b then
      
        select instr(fltw, '项', 1, b), fltw
          into v_index1, v_fltw
          from sys_codewfdm s
         where s.wfxw = c.wfxw
           and s.glbm = c.glbm;
      
        select instr(substr(v_fltw, 0, v_index1), '第', -1)
          into v_index2
          from dual d;
      
        update sys_codewfdm s
           set fltw = substr(v_fltw, 0, v_index2) || '(' ||
                      substr(v_fltw, v_index2 + 1, v_index1 - v_index2 - 1) || ')' ||
                      substr(v_fltw, v_index1)
         where s.wfxw = c.wfxw and s.glbm=c.glbm;
      end if;
    end loop;
  end loop;
end;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值