PL/SQL 发现空数据时游标不退出

PL/SQL cursor not exiting when null data found

我在 table 中有一个字段包含 'SMITH,ALLEN,WARD,JONES'。我正在尝试使用游标从 table 读取行,当找到这个特定字段时,使用 regexp_substr 将其拆分并使用 ',' 作为分隔符。

代码如下:

    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;

我希望分别返回名称,因此此游标应该在打印四个值后退出,因为在那之后它是 returns 个空值。但是 %NOTFOUND 条件不会退出循环,它会一直循环。似乎无法弄清楚问题。

所以问题是你的正则表达式没有终止。正如您所指出的,游标不断获取空值 "name".

的记录

一种选择是更改测试以退出循环:

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 ------------------------------------------------^