PL / SQL无限循环

时间:2013-09-26 11:15:10

标签: oracle plsql

我的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语句中包含这个循环,并且更喜欢循环中的一个保护。

2 个答案:

答案 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;