create procedure name_pro
as
str varchar2(50);
num number:=1;
cursor t_sor is
select a1,a2 from testa;
begin
for v_sor in t_sor loop 
num:=1;
loop
exit when instr(v_sor.a2,',',1,num)>0;
if num=1 then
str:=substr(v_sor.a2,1,instr(v_sor.a2,',',1)-1);
elsif instr(v_sor.a2,',',num)>0 then
str:=substr(v_sor.a2,instr(v_sor.a2,',',num-1)+1,instr(v_sor.a2,',',num)-1);
else
str:=substr(v_sor.a2,instr(v_sor.a2,',',num-1)+1,length(v_sor.a2));
end if;
insert into testa values(v_sor.a1,str);
num:=num+1;
end loop;
end loop;
end;
/

解决方案 »

  1.   

    sorry,把条件放在后面
    loop
    ....
    exit when instr(v_sor.a2,',',1,num)>0;--此句放在循环语句最后
    end loop;
      

  2.   

    十分感谢beckhambobo(beckham),你给的sql轮廓都已经出来了,但出来的结果是:
    A1 A2 
    -------------------- ---------------------------------------- 
    a aa 
    a1 aaaaaa 
    在这基础上我稍微修改了一下:
    create or replace procedure name_pro
    as
    str varchar2(50);
    num number:=1;
    cursor t_sor is
    select a1,a2 from testa;
    begin
    for v_sor in t_sor loop 
      num:=1;
      loop
      if num=1 and instr(v_sor.a2,',',1,num)=0 then
        str:=v_sor.a2;
      elsif num=1 and instr(v_sor.a2,',',1,num)>0 then
        str:=substr(v_sor.a2,1,instr(v_sor.a2,',',1)-1);
      elsif instr(v_sor.a2,',',1,num)=0 then
        str:=substr(v_sor.a2,instr(v_sor.a2,',',1,num-1)+1);
      else
        str:=substr(v_sor.a2,instr(v_sor.a2,',',1,num-1)+1,instr(v_sor.a2,',',1,num)-instr(v_sor.a2,',',1,num-1)-1);
      end if;
      insert into testb values(v_sor.a1,str);
      num:=num+1;
      exit when instr(v_sor.a2,',',1,num-1)=0;
      end loop;
    end loop;
    end;
    /