2016-10-25 4 views
0

Oracle 11gを使用しています。私のテーブルの1つにBLOB型のカラムがあります。私はこの列の値を列の既存の値と同じ長さのランダムな文字列に置き換えようとしています。これは私がやっていることです:行の1つは、長さ190,000の値を持つBLOBをランダムな文字列に置き換えます。

`update order set info = XMLSERIALIZE(CONTENT XMLTYPE('<edit>'||DBMS_RANDOM.STRING('X', length(info))||'</edit>') as blob) where info is not null;` 

として、私は

文字列連結の結果が最大サイズを超えているというエラーに遭遇しました。

これを行う方法は他にありますか?

+0

テキストデータをCLOBではなくBLOBとして保存するのはなぜですか? – mathguy

答えて

0

maximum length of a VARCHAR2 in SQL is 4000 bytes in Oracle 11g。このステートメントを実行しようとした行は、4000バイトの制限を超えているため、3987バイト(<edit></edit>タグでは4000から13)を超えるとエラーになります。

次のいずれかを実行できます

  • キャップのように3987までの長さ: DBMS_RANDOM.STRING('X', GREATEST(length(info), 3987))
  • または所望のブロブを構築するPL/SQLとdbms_lobパッケージを使用します。 PL/SQLの最大VARCHAR2長は32767バイトですが、32767チャンクのlength(info)をループし、dbms_lob.appendを使用してデータをlob変数に追加できるようにするループ構成も可能です。

編集: MAXではなくGREATESTを使用してください。

+0

私は 'DBMS_RANDOM.STRING( 'X'、MAX(length(info)、3987)を使用して返信mleonardに感謝します)'私は**グループ機能がここで許可されていないと言っているエラーを受けました** – rav

+0

謝罪私はGREATEST MAXではなく私は自分の答えを編集して、そこにコードをチェックします。 – mleonard87

関連する問題