Oracle中使用遊標轉換資料表中指定欄位內容格式(拼音轉數字)

來源:互聯網
上載者:User

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

  --擷取到欄位內容並進行處理
    columnstring:=myrecord.NNDP;
    --dbms_output.put_line('當前欄位對應的所有字串'||columnstring); --顯示結果 
    resultstring:='';
    declare  cursor mycursor1 is select * from table(fn_splitString(columnstring,'nan'));
    myrecord1 mycursor1%rowtype;  --定義遊標記錄類型 
    Counter1 int :=0; 
    begin 
    open mycursor1;  --開啟遊標 
   
    if mycursor1%isopen  then  --遊標開啟成功 
    loop --迴圈擷取記錄集   
    fetch mycursor1 into myrecord1; --擷取遊標中的記錄       

    if mycursor1%found then  --判斷是否有記錄 
    begin
     
    --判斷是否取到男性數量開始
    if length(resultstring)>0 then
      begin
        --擷取女性數量字串
        SELECT REPLACE(myrecord1.column_value,'nv','') into femalestring from dual;
        dbms_output.put_line('女性數字拼音'||femalestring);
        --轉換數字拼音為數字字元 
        select fn_getNumber(femalestring) into femalenumber from dual;
        resultstring:=resultstring||femalenumber||'女';
        --dbms_output.put_line('女性字串'||femalestring); --顯示結果     
      end;
    else
      begin
        --擷取男性數量字串
        malestring:=myrecord1.column_value;
        dbms_output.put_line('男性數字拼音'||malestring);
        --轉換數字拼音為數字字元
        select fn_getNumber(malestring) into malenumber from dual;
        resultstring:=malenumber||'男';
        --dbms_output.put_line('男性字串'||resultstring); --顯示結果
      end;
    end if;
    --判斷是否取到男性數量結束
   
    end;

    else
    exit;
    end if;--結束判斷是否有記錄
     
    end loop; 
    else   
        dbms_output.put_line('遊標1沒有開啟'); 
    end if;      --結束開啟遊標成功
    close mycursor1;
    end;

    dbms_output.put_line(resultstring); --顯示結果
   
    --更新資料庫資料
    update TB_USER set NNDP=resultstring where ID= myrecord.ID;   
   
    --select NNDP from TB_USER where NNDP <> ' ';   

end;

else           
exit;
end if;
 
end loop; 
else   
dbms_output.put_line('遊標0沒有開啟'); 
end if;   
close mycursor;
end; 

附:運行

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.