Oracle
 sql >> Database >  >> RDS >> Oracle

ERRORE alla riga 191:ORA-01489:il risultato della concatenazione di stringhe è troppo lungo

VARCHAR2 sono limitati a 4000 byte. Se ricevi questo errore

Quindi è abbastanza chiaro che la concatenazione supera i 4000 byte.

Ora cosa fare?

La tua prima soluzione per utilizzare invece CLOB è corretta.

select TO_CLOB(a)|| TO_CLOB(b)|| TO_CLOB(c) || TO_CLOB(d) 

Sembra che il tuo vero problema sia il salvataggio su file

Anche se non hai pubblicato come salvare il clob risultante in un file, credo che tu non lo stia facendo correttamente. Se provi a salvare su file nello stesso modo in cui lo stavi facendo con VARCHAR2, stai sbagliando.

Devi prima usare 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;