sql >> Databáze >  >> RDS >> Oracle

CHYBA na řádku 191:ORA-01489:výsledek zřetězení řetězců je příliš dlouhý

VARCHAR2 jsou omezeny na 4000 bajtů. Pokud se zobrazí tato chyba

Pak je celkem jasné, že zřetězení přesahuje 4000 bajtů.

Co teď dělat?

Vaše první řešení pro použití CLOB je správné.

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

Zdá se, že váš skutečný problém je ukládání do souboru

I když jste nezveřejnili, jak uložit výsledný clob do souboru, domnívám se, že to neděláte správně. Pokud se pokusíte uložit do souboru stejným způsobem, jako jste to dělali s VARCHAR2, děláte to špatně.

Nejprve musíte použít dbms_lob.read pro načtení clobu z databáze, pak použijte utl_file.put_raw zapisovat do souboru.

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. Učení proměnných vazeb v PL/SQL spolu se vstupem a výstupem výpočtu DBMS_OUTPUT.PUT_LINE

  2. je dobrým zvykem používat mysql_free_result($result)?

  3. Jak odstranit z výběru v MySQL?

  4. Koncový bod Spring Boot Actuator /health nezobrazuje informace o databázi nebo systému souborů