1. 程式人生 > >在PLSQL中實現分割字串

在PLSQL中實現分割字串

首先在SQL視窗建立table型別變數,用來宣告函式返回的陣列型別:

/*變數型別宣告*/
CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);
/*函式*/
CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)  
  RETURN ty_str_split  
  IS  
  j INT := 0;  
  i INT := 1;  
  len INT := 0;  
  len1 INT := 0;  
  str VARCHAR2 (4000);  
  str_split ty_str_split := ty_str_split ();  
  BEGIN  
    len := LENGTH (p_str);  
    len1 := LENGTH (p_delimiter);   
    WHILE j < len  
      LOOP  
        j := INSTR (p_str, p_delimiter, i);   
		/*INSTR(x, find_string [, start] [, occurrence]);搜尋find_string在x中並返回它出現的位置*/
		
		/*如果String2在String1中沒有找到,instr函式返回0*/
       IF j = 0  THEN  
            j := len;  
            /*j等於待分割的字串最後一個位置*/
            str := SUBSTR (p_str, i);    
            /*str等於將待分割字串從i位置分割到結束位置*/
	    /*新增到陣列*/
            str_split.EXTEND;  
            str_split (str_split.COUNT) := str;   
            /*陣列.count可以獲取到陣列實際長度*/
	    /*i代表待分割的字串開始分割的位置,len代表待分割字串長度或結束位置,如果待分割的字串開始分割的位置>=待分割字串長度或結束位置則分割結束,退出迴圈*/
            IF i >= len  
            THEN  
              EXIT;  
            END IF;  
        ELSE  
            str := SUBSTR (p_str, i, j - i);  
	    /*SUBSTR(x, start [, length]); 返回x的一個子開始於由start指定的位置。可選長度為子字串*/
	    /*i變成j+分割符長度的位置*/	
            i := j + len1;  
	    /*新增到陣列*/
            str_split.EXTEND;  
            str_split (str_split.COUNT) := str;  
        END IF;  
      END LOOP;  
      
    RETURN str_split;  
END fn_split;

測試程式碼:

/*測試程式碼*/
declare
  -- Non-scalar parameters require additional processing 
  s ty_str_split;
  len INTEGER;
begin
  -- Call the function
  s := fn_split('1,2,3',',');
  len :=s.count;
  dbms_output.put_line('陣列長度:'||len);
  FOR i IN 1..len 
    LOOP
      dbms_output.put_line(s(i));
    END LOOP;
  
end;
輸出:

參考易百教程