2017-04-08 35 views
0

我在包含'SMITH,ALLEN,WARD,JONES'的表中有一个字段。我试图用光标从表中读取行,当找到这个特定的字段时,使用regexp_substr将它分割为','作为分隔符。发现空数据时PL/SQL游标不会退出

下面是代码:

PROCEDURE x26837a_dummy IS 
    CURSOR d_cursor IS 
    SELECT regexp_substr('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, level) 
     FROM x26837a_dummy_table 
    CONNECT BY regexp_substr('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, 1) IS NOT NULL 
    lvar VARCHAR2(128) := ''; 
    BEGIN 
    OPEN d_cursor; 
    LOOP 
     FETCH d_cursor 
     INTO lvar; 
     EXIT WHEN d_cursor%NOTFOUND; 
     DBMS_OUTPUT.PUT_LINE(lvar); 
    END LOOP; 
    CLOSE d_cursor; 
    END x26837a_dummy; 

我想的名字单独返回,所以在印刷四个值后,这个光标应该退出,因为在那之后它返回空值。但%NOTFOUND条件不会退出循环并保持循环。似乎无法弄清楚这个问题。

回答

2

所以问题是你的正则表达式不会终止。正如你指出的那样,游标一直在用一个空的“名字”来获取记录。

一种办法是改变测试退出循环:

if lvar is null then exit; end if; 

另一种选择是固定的正则表达式。 CONNECT BY条款应为:

CONNECT BY regexp_substr('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, level) IS NOT NULL; 
    -- change this ------------------------------------------------^ 
+0

非常感谢。这工作 - >如果lvar是null然后退出;万一; 。 level参数返回所有集合,但我只需要一个,这就是我用'1'去的原因。 – Varghese