Oracle
 sql >> Datenbank >  >> RDS >> Oracle

FEHLER in Zeile 191:ORA-01489:Ergebnis der Zeichenfolgenverkettung ist zu lang

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;