2013-02-20 189 views
0

我在oracle中有一个表是这样的:字符串分割

servername  description             ObjectState 
----------------------------------------------------------------------------------------- 
vm1   SP LA - W IN S V R S #P19 99 9999 999999 999 QTY 1     0 
VM2   S PL A - V R STD #P29-9 9 99 QTY 2 : SPLVRENT #P3 999999 9 QTY 3  1 

等我想储存使用PL/SQL这样

servername description    ponumber     qty  objectstate 
-------------------------------------------------------------------------------------- 
vm1   SP LA - W IN S V R S P19 99 9999 999999 999 1  0 
vm2   S PL A - V R STD  P29-9 9 99    2  1 
vm2   SPLVRENT    P3 999999 9    3  1 

帮助我如何做到这一点的输出程序

+1

什么是你想要实现的逻辑(即你怎么知道在哪里一列开始,另一列结束)?我们应该使用第一个'#'字符和字符串'QTY'吗?然后任何':'开始一个新的逻辑行?只有两行数据,很难猜测如何推广规则。 – 2013-02-20 17:02:20

+0

@anand krishna到目前为止您尝试过什么。请张贴也,以便我们可以改善您的代码 – Saju 2013-02-20 17:02:31

回答

0

试试这个程序!

这将工作,如果描述的图案将与指定的空间和类似的描述,PHONENUM流程相同,数量

create or replace procedure sp_split_str 
as 
    end_pos number:=0; 
    strt_pos number :=1; 
    CNT NUMBER:=0; 
    v_desc varchar(200); 
begin 
    for i in (select * from table) loop 
      if(instr(i.description,':',1,1)=0) then 
        dbms_output.put_line('Server Name : '||i.servername); 
        dbms_output.put_line('Description : '||substr(i.description,1,instr(i.description,'#',1,1)-2)); 
        dbms_output.put_line('Phone Number : '||substr(i.description,instr(i.description,'#',1,1)+1,instr(i.description,'Q',-1,1)-2-instr(i.description,'#',1,1))); 
        dbms_output.put_line('Qty : '||substr(i.description,instr(i.description,'Q',-1,1)+4));   
        dbms_output.put_line('Object State : '||i.objectstate); 
      else 
        for J in 1..(length(i.description)-length(replace(i.description,':','')))+1 loop 
          IF(J=1) THEN 
           end_pos := instr(i.description,':',1,1); 
           v_desc := substr(i.description,strt_pos,end_pos-2); 
          ELSE 
           end_pos := instr(i.description,':',1,j); 
           strt_pos := instr(i.description,':',1,j-1); 
          END IF; 
          dbms_output.put_line('Server Name : '||i.servername); 
          dbms_output.put_line('Description : '||substr(v_desc,1,instr(v_desc,'#',1,1)-2)); 
          dbms_output.put_line('Phone Number : '||substr(v_desc,instr(v_desc,'#',1,1)+1,instr(v_desc,'Q',-1,1)-2-instr(v_desc,'#',1,1))); 
          dbms_output.put_line('Qty : '||substr(v_desc,instr(v_desc,'Q',-1,1)+4));   
          dbms_output.put_line('Object State : '||i.objectstate); 

          CNT := CNT+1; 
          IF(CNT=J) THEN 
            v_desc := substr(i.description,strt_pos+2); 
          ELSE 
            v_desc := substr(i.description,strt_pos+2,end_pos-2); 
          END IF; 
        END loop; 
      end if; 
     END LOOP; 

END;