VARCHAR2 sono limitati a 4000 byte. Se si ottiene questo errore
ERRORE alla linea 191: ORA-01489: risultato della concatenazione di stringhe è troppo lungo.
Quindi è abbastanza chiaro che la concatenazione supera i 4000 byte.
Ora cosa fare?
La prima soluzione per utilizzare CLOB è corretta.
select TO_CLOB(a)|| TO_CLOB(b)|| TO_CLOB(c) || TO_CLOB(d)
sembra che il problema vero è il risparmio di presentare
Sopra query non è lo spooling i dati correttamente in file di testo.
Mentre non hai pubblicato come salvare il clob risultante in un file, credo che non lo stai facendo correttamente.Se si tenta di salvare in un file nello stesso modo in cui lo si faceva con VARCHAR2, lo si sta facendo male.
È necessario prima utilizzare dbms_lob.read
per leggere il clob dal database, quindi utilizzare utl_file.put_raw
per scrivere su file.
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;
fonte
2015-05-07 16:43:20
Alcuni disponibili. sono suggerimenti su: http://stackoverflow.com/questions/14864055/listagg-function-and-ora-01489-result-of-string-concatenation-is-too-long – Sampath