0

我的 PL/SQL 技能非常有限,所以如果这是不明智的,我深表歉意。基本上,我有一个循环遍历一个 clob。当 clob 的值为空时,循环在过去(无限循环)给我带来了问题。我试图在这个循环的代码中构建一些检查,但是我防止无限循环的努力失败了。

以下是相关的代码片段:

        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 语句中,并且更喜欢循环中的守卫。

4

2 回答 2

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;
于 2013-09-26T12:13:15.697 回答
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;
于 2013-09-26T13:09:48.993 回答