1. 程式人生 > >使用PL SQL 編寫一個逗號分割字串分割處理函式

使用PL SQL 編寫一個逗號分割字串分割處理函式

create or replace function F_INTELLECT_FIRST_SALES_PROV(var_sales in varchar2,
       var_first_sales IN VARCHAR2,
        var_split in VARCHAR2) return varchar2 is
  Result varchar2(1);
  
  /****************************************************
  ** 
  ** All rights reserved.
  **
  ** 函式名稱:F_INTELLECT_FIRST_SALES_PROVINCE

  ** 參    數:【名稱】         【型別 】      【說明】
  **           var_sales          varchar2       字串1,逗號分隔的,如'aaa,bbb'
               var_first_sales    varchar2       字串2,逗號分割的,如'cc,aaa'
  **           var_split        varchar2       要使用的分隔符
  ** 返 回 值:Result           varchar2    處理後返回的值1/0
  ** 摘    要:如果字串2中的某一個分割的字串在字串1中就返回1,否則返回0
               
  **
  ** 當前版本:1.0
  **
  ** 作    者:liuzhih
  ** 完成日期:2013年1月29日
  ** 備    注:
  ****************************************************/
  var_element varchar2(4000);
  var_element2 varchar2(4000);
  var_tmp     varchar2(4000);
  var_tmp2    varchar2(4000);
  
BEGIN
     RESULT := '0';
     var_tmp := var_sales;
     var_tmp2 := var_first_sales;
     
  IF var_tmp2 IS NULL OR var_tmp2 ='' THEN
    return(Result);
  ELSIF var_tmp IS NULL OR var_tmp ='' THEN
    return(Result);
  ELSE
    /*如果字串1不為空,在後面加上一個特殊的字元,
    這樣迴圈時就可以直接在迴圈內部處理,不然需要在最外面迴圈出再一次處理var_tmp,因為最後一次var_tmp中不含有分隔符,不會進行loop迴圈*/
    var_tmp := var_tmp || var_split || '-1';
  END IF;
  
   while instr(var_tmp, var_split) > 0 LOOP
     /****迴圈字串1,每次獲得一個var_element****/
     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));
     
        while instr(var_tmp2, var_split) > 0 LOOP
          /****迴圈字串2,每次獲得一個var_element2****/
         var_element2 := substr(var_tmp2, 1, instr(var_tmp2, var_split) - 1);
          var_tmp2     := substr(var_tmp2,
                              instr(var_tmp2, var_split) + length(var_split),
                              length(var_tmp2));
           /*如果字串1中有字串2中的一個值,返回1*/
           IF var_element = var_element2 THEN
             RESULT := '1';
             return(Result);
           END IF;
        END LOOP;
        
        /*最後一個擷取的var_tmp2 不會進入迴圈 所以在此處處理
        
                          如果字串1中含有字串2的一個值,返回1*/
           IF var_element = var_tmp2 THEN
             RESULT := '1';
             return(Result);
           END IF;
     
   END LOOP;

  return(Result);
end F_INTELLECT_FIRST_SALES_PROV;