2013-02-20 230 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;