VARCHAR2 sind auf 4000 Bytes begrenzt. Wenn Sie diesen Fehler erhalten
Dann ist es ziemlich klar, dass die Verkettung 4000 Bytes überschreitet.
Was nun tun?
Ihre erste Lösung, stattdessen CLOB zu verwenden, ist richtig.
select TO_CLOB(a)|| TO_CLOB(b)|| TO_CLOB(c) || TO_CLOB(d)
Es scheint, als wäre Ihr eigentliches Problem das Speichern in einer Datei
Obwohl Sie nicht gepostet haben, wie Sie den resultierenden Clob in einer Datei speichern, glaube ich, dass Sie es nicht richtig machen. Wenn Sie versuchen, auf die gleiche Weise in eine Datei zu speichern, wie Sie es mit VARCHAR2 getan haben, machen Sie es falsch.
Sie müssen zuerst dbms_lob.read
verwenden Um den Clob aus der Datenbank zu lesen, verwenden Sie dann utl_file.put_raw
in Datei schreiben.
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;