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

FEJL på linje 191:ORA-01489:resultatet af strengsammenkædning er for lang

VARCHAR2 er begrænset til 4000 bytes. Hvis du får denne fejlmeddelelse

Så er det ret tydeligt, at sammenkædningen overstiger 4000 bytes.

Hvad skal man nu gøre?

Din første løsning til at bruge CLOB i stedet er korrekt.

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

Det ser ud til, at dit virkelige problem er at gemme til fil

Selvom du ikke skrev, hvordan du gemmer den resulterende klat til en fil, tror jeg, du ikke gør det korrekt. Hvis du forsøger at gemme til fil på samme måde, som du gjorde det med VARCHAR2, gør du det forkert.

Du skal først bruge dbms_lob.read for at læse cloben fra databasen, brug derefter utl_file.put_raw at skrive til fil.

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. xx tid siden funktionen virker ikke

  2. Forkert syntaks nær 'LIMIT' ved hjælp af mssql

  3. Returner værdi fra SQL Server Indsæt kommando ved hjælp af c#

  4. Hvordan importerer du en stor MS SQL .sql-fil?