@kfinityが示唆しているように、これはCLOB処理に関連しているだけでなく、dbms_output
の方法にも関連しています。 動作します。あなたは32kのチャンクでCLOBを読み取り、それらの各チャンクをput_line()
で書き出しています。 、32kチャンクごとに改行文字を追加します。これらはXMLドキュメント内の既存の改行と位置合わせされていないため、元の区切りを取得してから、余分な改行を取得します。これは、ややランダムでテキストの途中に表示されますが、実際には予測可能な場所にあります。
明らかな解決策は、put_line()
から切り替えることです。 put()
へ 、ただし、これにより最大バッファサイズが壊れ、「ORU-10028:行長オーバーフロー、1行あたり32767バイトの制限」のようなものがスローされます。
固定の32kチャンクで読み取るのではなく、一度に1行ずつ読み取ることができます。 CLOBは実際には行自体を理解していませんが、次のような改行を探すことができます。
WHILE pos < v_clob_length LOOP
-- read to next newline if there is one, rest of CLOB if not
if dbms_lob.instr(v_clob, chr(10), pos) > 0 then
amount := dbms_lob.instr(v_clob, chr(10), pos) - pos;
dbms_lob.read(v_clob, amount, pos, buffer);
pos := pos + amount + 1; -- skip newline character
else
amount := 32767;
dbms_lob.read(v_clob, amount, pos, buffer);
pos := pos + amount;
end if;
dbms_output.put_line(buffer);
END LOOP;
if
現在の位置の後に改行文字を探します。 1つが見つかった場合、量は現在の位置からその新しい行までの文字数として計算され(つまり、改行自体は必要ないため、マイナス1)、その数の文字を読み取り、位置を調整します。読み取った量に1を加えたもの(改行をスキップするため-put_line()
として不要/不要 まだ1つ追加します)。
見つからない場合は、最大32kを読み取ります。できれば1回だけです。それ以上の文字が改行なしで残っている場合は、2回目の読み取りを実行しますが、それでもその不正な改行を追加してその行を区切ります。 dbms_output
を使用してそれについてできることはあまりありません ただし、utl_file
に切り替える必要があります クライアントにスプーリングする代わりにサーバーに書き込む。