2014-01-23 19 views
0

我寫了一個小程序來查找字符串中最後一個空格的位置。如果找到,請在該空格之前取出所有字符,並繼續執行此操作,直到結果的長度小於或等於20. 但是,程序似乎未按預期工作。使用SUBSTR&INSTR操作應用FOR循環的問題

這是程序。

declare 
    v_building_nam varchar2(100) :='lnkilap Mahallesi Üntel Sok. B1Blok'; 
begin 
    FOR i in 1..10 
    LOOP 
     EXIT when length(v_building_nam) <=20; 

     v_building_nam := substr(v_building_nam,1,instr(v_building_nam,' ',-1)); 

    END LOOP; 

    dbms_output.put_line(v_building_nam); 

END; 

輸出:

lnkilap Mahallesi Üntel Sok. 

這似乎只是工作的第一次操作和循環然後運行高達10倍,沒有價值的變化。任何人都可以讓我知道我是否做錯了什麼?

+2

後'你的字串substr'最後一個符號是一個空格:) –

回答

1

是不是這樣: 查找字符串中的第一個空格。 如果位置> 20取前20個字符。如果位置< 20將所有字符都放到空格處。

declare 
    l_position pls_integer; 
    l_string varchar2(100) := 'Thisissomestringwith spaces'; 
begin 
    l_position := least(instr(l_string,' ')-1,20); 
    dbms_output.put_line(substr(l_string,1,l_position)); 
end; 
3
set serveroutput on; 
    declare 
    v_building_nam varchar2(100) :='lnkilap Mahallesi Üntel Sok. B1Blok'; 
    begin 
    FOR I IN 1..10 
    LOOP EXIT WHEN LENGTH(V_BUILDING_NAM) <=20; 
    DBMS_OUTPUT.PUT_LINE(I); 
    v_building_nam := substr(v_building_nam,1,instr(v_building_nam,' ',-1)-1); --calculate previous position of space 
    DBMS_OUTPUT.PUT_LINE(V_BUILDING_NAM); 
    END LOOP; 
    dbms_output.put_line(v_building_nam); 
    END; 
    /

你正在服用的空間,你的最後一個位置,你應該採取少1位

+1

我建議保存到SUBSTR一個臨時變量並檢查它是否爲NULL,並且僅當它不將v_building_nam設置爲等於它時。這可以避免這個問題,如果在最後的20個字符中沒有空格,會給SUBSTR一個負值,導致它返回NULL。 –

+0

是的,我接受約翰是有效的,因爲如果沒有找到空格instr將返回0 – 2014-01-24 05:48:35