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;