2012-03-16 6 views
7

sto aggiornando un BLOB con grande monte di testo e ottengo questo errore:Come posso evitare errori di "lunghezza variabile troppo lunga" nello sviluppatore SQL?

SQL Error: ORA-06502: PL/SQL: numeric or value error: raw variable length too long 

C'è un modo intorno ad esso?

Il testo è lungo 2.670 caratteri, in fase di conversione tramite utl_i18n.string_to_raw, come spiegato in How do I edit BLOBs (containing JSON) in Oracle SQL Developer?, ed è tutto su una riga nella query.

Aggiornamento: Il BLOB in questione contiene già un testo lungo 2686 caratteri, che è più lungo del testo che sto tentando di inserire.

+0

possibile duplicato di [Come modifico BLOB (contenente JSON) in Oracle SQL Developer?] (Http://stackoverflow.com/questions/9218474/how-do-i-edit-blobs-containing- json-in-oracle-sql-developer) –

+1

Ho aggiornato la mia risposta nell'altra discussione per includere un approccio un po 'più complicato che è più flessibile di usare la funzione 'utl_i18n.string_to_raw'. –

risposta

6

A RAW è limitato a 2000 byte. Se i tuoi dati sono più lunghi, dovrai archiviarli in un CLOB e convertire lo CLOB in uno BLOB che è, sfortunatamente, un po 'più complicato della funzione string_to_raw. Qualcosa di simile funzionerà assumendo che tu possa assegnare l'intera stringa a una variabile CLOB che dovrebbe funzionare fintanto che la stringa è inferiore a 32676 byte di lunghezza. Se è più lungo, è necessario scrivere su CLOB in pezzi e quindi convertire in BLOB.

declare 
    l_blob  blob; 
    l_clob  clob := rpad('{"foo": {"id": "1", "value": "2", "name": "bob"}}',3200,'*'); 
    l_amt   integer := dbms_lob.lobmaxsize; 
    l_dest_offset integer := 1; 
    l_src_offset integer := 1; 
    l_csid  integer := dbms_lob.default_csid; 
    l_ctx   integer := dbms_lob.default_lang_ctx; 
    l_warn  integer; 
begin 
    dbms_lob.createTemporary(l_blob, false); 
    dbms_lob.convertToBlob(l_blob, 
          l_clob, 
          l_amt, 
          l_dest_offset, 
          l_src_offset, 
          l_csid, 
          l_ctx, 
          l_warn); 
    update json_data 
    set data = l_blob; 
end; 
/
+0

Funziona, ma perché 'rpad'? Ho bisogno di impostare la lunghezza di 'rpad' sulla lunghezza della stringa che sto inserendo. C'è un modo per aggirare questo problema non usando 'rpad'? – Xonatron

+1

@ MatthewDoucette - Non dovresti aver bisogno di usare 'RPAD'. Stavo solo usando il mio esempio per generare una stringa di 3200 caratteri perché sono troppo pigro per scrivere una stringa così lunga e sarebbe un problema formattare una stringa in un post SO. –

+0

Ah, ho capito. Grazie mille. Aiuto fantastico! – Xonatron

0

Immagino quale sia il problema se i dati che si stanno inserendo nella colonna sono troppo grandi per il tipo di dati della colonna. Controlla il valore che stai cercando di inserire nella colonna e quindi aggiorna il tipo di dati della colonna.

+0

Sei sicuro? Il BLOB contiene già del testo più grande del testo che sto tentando di inserire. Per me, questo lo rende un problema di SQL Developer (interfaccia), non un problema di database. – Xonatron

+0

Potrebbe essere correlato al limite massimo di 'utl_i18n.string_to_raw', se ce n'è uno. – Xonatron