1、oracle10g中是否具有以下功能的函数:
将字符串:100,101,102
拆分后形成以下3条记录:
100
101
102
2、或者是否可以写个自定义函数将此字符串拆分,然后以集合返回?

解决方案 »

  1.   

    xiaoxiao1984(笨猫儿),我需要的是一个函数。SP不考虑的
      

  2.   

    oracle不能做到sqlserver那样的。   ……+++++++++++++
      

  3.   

    如果格式是固定的xxx,xxx,xxx的话,直接substr+instr就可以了SQL> create table test(a varchar2(30));表已创建。SQL> insert into test values('100,101,102');已创建 1 行。SQL> select substr(a,0,instr(a,',')-1),
      2  substr(a,instr(a,',')+1,instr(substr(a,instr(a,',')+1),',')-1),
      3  substr(a, instr(a,',',-1)+1)
      4  from test;SUBSTR(A,0,INSTR(A,',')-1)
    ------------------------------------------------------------
    SUBSTR(A,INSTR(A,',')+1,INSTR(SUBSTR(A,INSTR(A,',')+1),',')-
    ------------------------------------------------------------
    SUBSTR(A,INSTR(A,',',-1)+1)
    ------------------------------------------------------------
    100
    101
    102不然的话还是写函数吧
      

  4.   

    这样可以吗?
    SQL> create table tmp
      2  (
      3  name varchar2(40),
      4  ny varchar2(10),
      5  str varchar2(100)
      6  )
      7  /Table created.SQL> insert into tmp values ('aa', '200607', '6,7');1 row created.SQL> insert into tmp values ('bb', '200608', '4,5,6,7,8,9');1 row created.SQL> select * from tmp
      2  /NAME                                     NY         STR
    ---------------------------------------- ---------- ------------------------------------------------
    aa                                       200607     6,7
    bb                                       200608     4,5,6,7,8,9SQL> create or replace procedure substring_array(name varchar2, ny varchar2, str in varchar2) as
      2  type array_str is table of varchar2(100)
      3       index by binary_integer;
      4  myarray array_str;
      5  v_str varchar2(4000) default str;
      6  begin
      7    for i in 0 .. length(str)-length(replace(str,',',''))+1 loop
      8  
      9        if instr(v_str,',') = 0 then 
     10            myarray(i+1) := v_str ;
     11        else 
     12            myarray(i+1) := substr(v_str,0,instr(v_str,',')-1);       
     13        end if;
     14        v_str := substr(v_str,instr(v_str,',')+1);
     15    end loop;
     16    
     17    for i in 0 ..length(str)-length(replace(str,',','')) loop
     18        dbms_output.put_line(name || ' ' || ny || ' ' || myarray(i+1));
     19    end loop ;
     20  end substring_array;
     21  /Procedure created.SQL> declare
      2  name varchar2(40);
      3  ny varchar2(10);
      4  str varchar2(100);
      5  begin
      6  for c1 in (select name,ny,str from tmp)
      7  loop
      8  substring_array(c1.name,c1.ny,c1.str);
      9  end loop;
     10  end;
     11  /
    aa 200607 6
    aa 200607 7
    bb 200608 4
    bb 200608 5
    bb 200608 6
    bb 200608 7
    bb 200608 8
    bb 200608 9PL/SQL procedure successfully completed.SQL>
      

  5.   

    FYI.http://community.csdn.net/Expert/topic/5111/5111737.xml?temp=.5863459
      

  6.   

    to Eric_1999(╙@^@╜) ,因为我是在一句SQL调用,所以不能用SP。目前现在问题已经解决,参考的是另一贴子。
      

  7.   

    解决方法如下:
    1、声明一个Table类型
    2、增加一个function解析字符串,以Table返回具体如下:
    ----------------------------------------------------CREATE OR REPLACE FUNCTION f_GetSubSpec/*
    ============================================
    版本:v1.0
    名称:xx
    作用:xxx
    说明:
    创建:xxx,2006-11-3
    修改:xxx,2006-11-3
    ============================================
    */(
        varYearID  IN  NUMBER,   -- 年度标识
        varSpecID  IN  NUMBER    -- 投资结构节点标识
    )
    RETURN NUMBER_SET DETERMINISTIC PIPELINED IS
      varNodesString VARCHAR2(2000);
      varNodeID VARCHAR2(100);
      i INTEGER;
    BEGIN
        varNodesString := f_getsubspecstring(varYearID, varSpecID);
        
        i := INSTR(varNodesString, ',');
        WHILE i <> 0 LOOP
            varNodeID := SUBSTR(varNodesString,1, i - 1);
            PIPE ROW(varNodeID);
            varNodesString := SUBSTR(varNodesString, i + 1);
            i := INSTR(varNodesString, ',');
        END LOOP;
        IF varNodesString IS NOT NULL THEN
            PIPE ROW(varNodeID);
        END IF;
        
        RETURN;
    END;
      

  8.   

    2、声明类型如下:
    -------------------------------------------
    CREATE OR REPLACE TYPE NUMBER_SET IS TABLE OF NUMBER