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