使用SUBSTR&的FOR循环问题INSTR业务

时间:2014-01-23 13:03:17

标签: sql oracle loops plsql

我写了一个小程序来查找字符串中最后一个空格的位置。如果找到,则取出该空格之前的所有字符并继续执行此操作,直到结果的长度小于或等于20。 但似乎该计划没有按预期工作。

这是该计划。

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 个答案:

答案 0 :(得分: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 :(得分:1)

这不是: 找到字符串中的第一个空格。 如果位置> 20取前20个字符。如果位置&lt; 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;