VARCHAR2は4000バイトに制限されています。このエラーが発生した場合
次に、連結が4000バイトを超えることはかなり明らかです。
今何をしますか?
代わりにCLOBを使用する最初の解決策は正しいです。
select TO_CLOB(a)|| TO_CLOB(b)|| TO_CLOB(c) || TO_CLOB(d)
あなたの本当の問題はファイルへの保存にあるようです
結果のCLOBをファイルに保存する方法を投稿していませんが、正しく行っていないと思います。 VARCHAR2で行ったのと同じ方法でファイルに保存しようとすると、間違った方法で保存されます。
最初にdbms_lob.read
を使用する必要があります データベースからclobを読み取るには、utl_file.put_raw
を使用します。 ファイルに書き込む。
DECLARE
position NUMBER := 1;
byte_length NUMBER := 32760;
length NUMBER;
vblob BLOB;
rawlob RAW(32760);
temp NUMBER;
output utl_file.file_type;
BEGIN
-- Last parameter is maximum number of bytes returned.
-- wb stands for write byte mode
output := utl_file.fopen('DIR', 'filename', 'wb', 32760);
position := 1;
select dbms_lob.getlength(yourLob)
into len
from somewhere
where something;
temp := length;
select yourLob
into vlob
from somewhere
where something;
IF len < 32760 THEN
utl_file.put_raw(output, vblob);
-- Don't forget to flush
utl_file.fflush(output);
ELSE -- write part by part
WHILE position < len AND byte_length > 0
LOOP
dbms_lob.read(vblob, byte_length, position, rawlob);
utl_file.put_raw(output,rawlob);
-- You must admit, you would have forgot to flush.
utl_file.fflush(output);
position := position + byte_length;
-- set the end position if less than 32000 bytes
temp := temp - bytelen;
IF temp < 32760 THEN
byte_length := temp;
END IF;
END IF;
END;