0

私の PL/SQL スキルは非常に限られているため、これが非常に簡単である場合は申し訳ありません。基本的に、クロブを反復処理するループがあります。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 ステートメントでラップすることは避けたいので、ループ内にガードを配置することをお勧めします。

4

2 に答える 2

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 に答える