sql >> データベース >  >> RDS >> Oracle

sqlplusの結果をxmlファイルにスプールするときに不要な新しい行

    @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に切り替える必要があります クライアントにスプーリングする代わりにサーバーに書き込む。




    1. それと連結された文字列を使用してMysqlでid(autoincremented)を作成するにはどうすればよいですか? phpのみを使用

    2. phpとmysqlを使用してcsvファイルを作成する場合のファイルサイズの制限はありますか?

    3. 数字を文字列パラメータとして持つSoundex

    4. SELECT句で複数のセットを返す関数に期待される動作は何ですか?