sql >> Database >  >> RDS >> Oracle

FOUT op regel 191:ORA-01489:resultaat van tekenreeksaaneenschakeling is te lang

VARCHAR2 zijn beperkt tot 4000 bytes. Als u deze foutmelding krijgt

Dan is het vrij duidelijk dat de aaneenschakeling de 4000 bytes overschrijdt.

Wat nu te doen?

Uw eerste oplossing om in plaats daarvan CLOB te gebruiken, is correct.

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

Het lijkt erop dat uw echte probleem het opslaan in een bestand is

Hoewel je niet hebt gepost hoe je de resulterende klomp in een bestand kunt opslaan, geloof ik dat je het niet correct doet. Als je probeert op te slaan in een bestand op dezelfde manier als je het deed met VARCHAR2, doe je het verkeerd.

U moet eerst dbms_lob.read . gebruiken om de clob uit de database te lezen, gebruik dan utl_file.put_raw om naar een bestand te schrijven.

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;


  1. Inleiding tot SQL-joins

  2. MySQL versus JSON - Waarom?

  3. Controleer niet-verzonden e-mail in SQL Server (T-SQL)

  4. Oracle equivalent aan SQL Server STUFF functie?