填充指定字符串的每一節到指定長度,不夠的在左惻用0補足,並將分隔符"-"去除,可用於排序的函數

create or replace function Fun_Digit_Replace(P_C_InStr varchar2 ,P_C_SepStr varchar2 ,P_N_LenPerSite number)
  return varchar2 is
 /*==========================================================================
 
   功能: 填充指定字符串的每一節到指定長度,不夠的在左惻用0補足,並將分隔符去除
 
 
 ============================================================================*/
    Result        varchar2(150);
    V_N_Site1     number;
    V_N_Site2     number;
    V_C_InStr     varchar2(150);
    V_C_LeftStr   varchar2(150);
    V_C_RightStr  varchar2(150);
    V_C_TempStr   varchar2(150);
    begin

    Result := null;
    V_C_InStr := P_C_InStr;

    if P_C_InStr is null or length(P_C_InStr)  < 1 then
       return Result;
    end if;

    if P_C_InStr is null or length(P_C_InStr)  < 1 then
       return P_C_InStr;
    end if;

    IF P_N_LenPerSite IS NULL OR P_N_LenPerSite  < 1 THEN
       return Result;
    END IF;
  dbms_output.put_line(V_C_InStr);
  dbms_output.put_line(P_N_LenPerSite);
    LOOP
        EXIT WHEN INSTR(V_C_InStr,P_C_SepStr)  < 1;
        V_C_LeftStr   := substr(V_C_InStr,1,INSTR(V_C_InStr,P_C_SepStr)-1);
        V_C_TempStr := null;
        select substr(V_C_InStr
                               ,INSTR(V_C_InStr,P_C_SepStr) + Length(P_C_SepStr)
                               ,Decode( INSTR(V_C_InStr,P_C_SepStr,1,2)
                                      ,0
                                       ,Length(V_C_InStr) + 1
                                       ,INSTR(V_C_InStr,P_C_SepStr,1,2) - INSTR(V_C_InStr,P_C_SepStr) - 1
                                       )
                               ) into V_C_TempStr
          from dual;


        V_C_RightStr := null;
        select substr(V_C_InStr
                               ,Decode( INSTR(V_C_InStr,P_C_SepStr,1,2)
                                       ,0
                                       ,Length(V_C_InStr) + 1
                                       ,INSTR(V_C_InStr,P_C_SepStr,1,2)
                                      ) --+ Length(P_C_SepStr)
                               ,Length(V_C_InStr)
                               ) into V_C_RightStr
          from dual;

        if V_C_TempStr is null or Length(V_C_TempStr)  < P_N_LenPerSite then
           if V_C_TempStr is null then
              V_C_TempStr := Substr( '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 '
                                   ,1
                                   ,P_N_LenPerSite);
            else
              V_C_TempStr := Substr( '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 '
                                   ,1
                                   ,P_N_LenPerSite - Length(V_C_TempStr)
                                   )||V_C_TempStr;
           end if;
        end if;

        if V_C_LeftStr is null then
           V_C_LeftStr := V_C_TempStr;
         else

           if Length(V_C_LeftStr)  < P_N_LenPerSite then
              V_C_LeftStr := Substr( '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 '
                                   ,1
                                   ,P_N_LenPerSite - Length(V_C_LeftStr)
                                   ) || V_C_LeftStr;
           end if;

           V_C_LeftStr := V_C_LeftStr  || V_C_TempStr;

        end if;

        if V_C_RightStr is null then
           V_C_LeftStr := V_C_LeftStr;
         else
           V_C_LeftStr := V_C_LeftStr  || V_C_RightStr;
        end if;

        V_C_InStr := V_C_LeftStr;

    END LOOP;

    if Length(V_C_InStr)  < P_N_LenPerSite then
      V_C_InStr := Substr( '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 '
                           ,1
                           ,P_N_LenPerSite - Length(V_C_InStr)
                           )  || V_C_InStr;
    end if;
   return V_C_InStr;

end Fun_Digit_Replace;
 

發佈了40 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章