oracle中使用游标转换数据表中指定字段内容格式(拼音转数字)
应用场景:将oracle数据表tb_user中字段nndp的内容中为[sannanyinv]转换为[3男1女]
主要脚本:一个游标脚本+分割字符串函数+拼音转数字脚本
操作步骤如下:
1、创建类型
create or replace type splittable is table of varchar2(100);
2、创建函数fn_splitstring(功能是将字符串分割成多条记录)
--测试语句select * from table(fn_splitstring('ernanyinv','nan'))
--fn_splitstring函数脚本代码
create or replace function fn_splitstring(var_str in varchar2, var_split in varchar2)
return splittable is
var_out splittable;
var_tmp varchar2(4000);
var_element varchar2(4000);
begin
var_tmp := var_str;
var_out := splittable();
--如果存在匹配的分割符
while instr(var_tmp, var_split) > 0 loop
var_element := substr(var_tmp, 1, instr(var_tmp, var_split) - 1);
var_tmp := substr(var_tmp,
instr(var_tmp, var_split) + length(var_split),
length(var_tmp));
--var_out.extend(1);
var_out.extend;
var_out(var_out.count) := var_element;
end loop;
--var_out.extend(1);
var_out.extend;
var_out(var_out.count) := var_tmp;
return var_out;
end fn_splitstring;
3、创建函数fn_getnumber(功能是将数字拼音字符串转为数字)
--测试语句select fn_getnumber('yi') from dual;
--fn_getnumber函数脚本代码
create or replace function fn_getnumber(p_str in varchar2)
return varchar2
as
v_compare varchar2(20);
v_return varchar2(1);
begin
if p_str is null
then
return '';
end if;
v_compare:= lower(p_str);
case
when v_compare = 'yi'
then
v_return := '1';
when v_compare = 'er'
then
v_return := '2';
when v_compare = 'san'
then
v_return := '3';
when v_compare = 'si'
then
v_return := '4';
when v_compare = 'wu'
then
v_return := '5';
when v_compare = 'liu'
then
v_return := '6';
when v_compare = 'qi'
then
v_return := '7';
when v_compare = 'ba'
then
v_return := '8';
when v_compare = 'jiu'
then
v_return := '9';
else
v_return := '0';
end case;
return v_return;
end fn_getnumber;
4、运行转换脚本(功能是将数据表中指定字段内容转换为所需要的格式)
--oracle中使用游标转换数据表中指定字段内容格式由拼音到数字
--update tb_user set nndp='sannansinv';
--定义游标
declare
femalenumber number:=0;--定义最后的男性数量
malenumber number:=0;--定义最后的女性数量
femalestring varchar2(20):='er';--定义男性拼音分割符
malestring varchar2(20):='sinv';--定义女性拼音分割符
columnstring nvarchar2(40):=''; --定义数据表字段取出的字符串内容
resultstring nvarchar2(40):='';--定义最后处理的字符串
cursor mycursor is select * from tb_user where nndp' '; --从数据表查询对应要更新的记录:
myrecord mycursor%rowtype; --定义游标记录类型
counter int :=0;
begin
open mycursor; --打开游标
if mycursor%isopen then --判断打开成功
loop --循环获取记录集
fetch mycursor into myrecord; --获取游标中的记录
if mycursor%found then --游标的found属性判断是否有记录
begin