我的PL / SQL技能非常有限,所以我很抱歉,如果这不是一件容易的话。基本上,我有一个遍历clob的循环。当clob的值为null时,循环给了我过去的问题(无限循环)。我试图在这个循环的代码中构建一些检查,但是我努力防止无限循环失败。
以下是代码的相关部分:
v_offset NUMBER DEFAULT 1;
v_response CLOB;
SELECT VALUE
INTO v_response
FROM json_cache
WHERE json_key = 'EMPLOYEES';
--infinite loop occurs when v_response = ''
LOOP
EXIT WHEN v_offset > DBMS_LOB.getlength (v_response)
or DBMS_LOB.getlength (v_response) = 0
or v_offset = 400000;
HTP.prn (DBMS_LOB.SUBSTR (v_response, 20000, v_offset));
v_offset := v_offset + 20000;
END LOOP;
EXIT WHEN
语句中的附加条件是否应该阻止无限循环发生?当v_response
为空时,如何终止/阻止此循环?我想避免在if语句中包含这个循环,并且更喜欢循环中的一个保护。
答案 0 :(得分:2)
您始终可以检查空值:
loop
exit when v_offset > dbms_lob.getlength (v_response)
or dbms_lob.getlength (v_response) = 0
or v_offset = 400000
or dbms_lob.getlength (v_response) is null;
v_offset := v_offset + 20000;
end loop;
答案 1 :(得分:0)
你可以像这样添加额外的控件;
DECLARE
v_offset NUMBER DEFAULT 1;
v_response CLOB;
BEGIN
SELECT VALUE
INTO v_response
FROM json_cache
WHERE json_key = 'EMPLOYEES';
--infinite loop occurs when v_response = ''
LOOP
EXIT WHEN v_offset > DBMS_LOB.getlength (v_response)
or DBMS_LOB.getlength (v_response) = 0
or v_offset = 400000;
HTP.prn (DBMS_LOB.SUBSTR (v_response, 20000, v_offset));
v_offset := v_offset + 20000;
if v_response is null then
exit;
end if;
END LOOP;
END;