sql >> Databasteknik >  >> RDS >> Oracle

FEL på rad 191:ORA-01489:resultatet av strängsammansättningen är för lång

VARCHAR2 är begränsade till 4000 byte. Om du får det här felet

Då är det ganska tydligt att sammankopplingen överstiger 4000 byte.

Vad ska jag göra nu?

Din första lösning att använda CLOB istället är korrekt.

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

Det verkar som om ditt verkliga problem är att spara till fil

Även om du inte postade hur du sparar den resulterande klumpen till en fil, tror jag att du inte gör det korrekt. Om du försöker spara till fil på samma sätt som du gjorde det med VARCHAR2, gör du det fel.

Du måste först använda dbms_lob.read för att läsa klumpen från databasen, använd sedan utl_file.put_raw att skriva till filen.

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. Hur man bryter insert-frågan, innan insert trigger mysql

  2. MySQL-fråga för aktuell GMT-tid

  3. Få lista över MySQL-tabeller och kör en kod för varje tabell

  4. PDO, $_GET och SELECTing från MySQL Database