字符串“a-b-c-d”变成4行记录
SQL> SELECT * FROM  f_fun('a-b-c-d');

COLUMN_VALUE
--------------------------------------------------------------------------------
a
b
c
d
4行记录转变成字符串
f
--------------------------------------------------------------------------------
a
b
c
d    
转换成:a-b-c-d  

解决方案 »

  1.   

    写一个函数f_fun把'a-b-c-d'的a,b,c,d提取存到数组里,然后select * from table(f_fun('a-b-c-d'))
      

  2.   

    create or replace procedure pro_splitWithSeparator(splitString in varchar2, separator in varchar2)
    is
    --declare
      posion int;
      maxTimes int;
      temp varchar2(1000);
      --splitString varchar2(1000) := 'a,bb,ccc,dddd,eeeee'; 
      --separator varchar2(10) := ',';
    begin
      maxTimes := 0;
      temp := splitString;
      loop
        exit when instr(temp,separator)<=0;
        
        maxTimes := maxTimes + 1;
        posion := instr(temp,separator);
        --dbms_output.put_line(to_char(posion));    
        temp := substr(temp, posion + 1);    
        --dbms_output.put_line(temp);    
      end loop;
      --dbms_output.put_line('-----start-----');    
      for splitList in  (select regexp_substr(splitString, '[^' || separator || ']+', 1, level) as splitResult from dual connect by level <= maxTimes + 1) loop
        dbms_output.put_line(splitList.splitResult);
      end loop;  
    end;
    --使用
    begin
      pro_splitWithSeparator('a,bb,ccc,dddd,eeeee',',');
    end;--结果
    --我写的PROCEDURE是没有返回值的,直接打印。如果需要返回数组,需要则添加新的OUT参数
    a
    bb
    ccc
    dddd
    eeeee
    --第二个问题,灵活性太强了,写成PROCEDURE还不好用些,直接用SQL语句吧
    select replace(wm_concat(字段名称),',','-') from 表名
    --如果有分组字段则需要添加下一行分组代码
    --select 分组字段,replace(wm_concat(字段名称),',','-') from 表名
    --group by 分组字段