我需要一个存储过程,可以把我输入的 字符串按特定的分隔符拆分谁知道怎么写。例如 :输入参数为abcdefg$abbbbbb$
拆分后为abcdefg 和 abbbbbb两个。

解决方案 »

  1.   

    declare
     s varchar2(1000);
     idx int;
    begin
     s:='abcdefg$abbbbbb$';
     idx:=instr(s,'$',1);
     while idx>0 loop
       dbms_output.put_line( substr(s,1,idx-1 ) );
       s:=substr(s,idx+1,length( s ) );
       idx:=instr(s,'$',1);
     end loop;
    end;
      

  2.   

    也可以写成函数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);        IF j = 0
            THEN
                j := len;
                str := SUBSTR (p_str, i);
                str_split.EXTEND;
                str_split (str_split.COUNT) := str;            IF i >= len
                THEN
                    EXIT;
                END IF;
            ELSE
                str := SUBSTR (p_str, i, j - i);
                i := j + len1;
                str_split.EXTEND;
                str_split (str_split.COUNT) := str;
            END IF;
        END LOOP;    RETURN str_split;
    END fn_split;
    /
    --测试
    DECLARE
        CURSOR c
        IS
            SELECT *
              FROM TABLE (CAST (fn_split ('1;;12;;123;;1234;;12345', ';;') AS ty_str_split
                               )
                         );    r c%ROWTYPE;
    BEGIN
        OPEN c;    LOOP
            FETCH c INTO r;        EXIT WHEN c%NOTFOUND;
            DBMS_OUTPUT.put_line (r.column_value);
        END LOOP;    CLOSE c;
    END;
    --输出结果
    1
    12
    123
    1234
    12345
      

  3.   

    hongqi162(失踪的月亮) ( ) 信誉:100  2007-09-05 16:46:59  得分: 0  
     
     
       declare
     s varchar2(1000);
     idx int;
    begin
     s:='abcdefg$abbbbbb$';
     idx:=instr(s,'$',1);
     while idx>0 loop
       dbms_output.put_line( substr(s,1,idx-1 ) );
       s:=substr(s,idx+1,length( s ) );
       idx:=instr(s,'$',1);
     end loop;
    end;
      
     
    支持ing!