2012-03-16 19 views
7

Estoy actualizando un BLOB con un gran monte de texto y me sale este error:¿Cómo puedo evitar errores "longitud variable sin procesar demasiado largos" en SQL Developer?

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

¿Hay alguna manera de evitarlo?

El texto tiene 2.670 caracteres de longitud, se convierte a través de utl_i18n.string_to_raw, como se explica en How do I edit BLOBs (containing JSON) in Oracle SQL Developer?, y está todo en una línea en la consulta.

Actualización: El BLOB en cuestión ya contiene texto de 2.686 caracteres, que es más largo que el texto que estoy tratando de insertar.

+0

posible duplicado de [¿Cómo edito BLOB que contiene (JSON) en Oracle SQL Developer?] (Http://stackoverflow.com/questions/9218474/how-do-i-edit-blobs-containing- json-in-oracle-sql-developer) –

+1

Actualicé mi respuesta en el otro hilo para incluir un enfoque un tanto más complicado que es más flexible que usar la función 'utl_i18n.string_to_raw'. –

Respuesta

6

A RAW tiene un límite de 2000 bytes. Si sus datos son más largos que eso, deberá almacenarlos en un CLOB y luego convertir el CLOB en un BLOB que, desafortunadamente, es un poco más complicado que la función string_to_raw. Algo así funcionará suponiendo que puede asignar la cadena completa a una variable CLOB que debería funcionar siempre que la cadena tenga menos de 32676 bytes de longitud. Si es más largo que eso, tendrá que escribir en el CLOB en pedazos y luego convertirlo a 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

Esto funciona, pero ¿por qué 'rpad'? Necesito establecer la longitud de 'rpad' a la longitud de la cadena que estoy insertando. ¿Hay alguna forma de evitar esto al no usar 'rpad'? – Xonatron

+1

@MatthewDoucette - No debería necesitar usar 'RPAD' en absoluto. Lo estaba usando en mi ejemplo para generar una cadena de 3200 caracteres porque soy demasiado vago para escribir una cadena tan larga y sería un dolor formatear una cadena así en una publicación SO. –

+0

Ah, lo entiendo. Muchas gracias. Impresionante ayuda! – Xonatron

0

Supongo que el problema es que los datos que está insertando en la columna son demasiado grandes para el tipo de datos de la columna. Verifique el valor que intenta insertar en la columna y luego actualice el tipo de datos de la columna.

+0

¿Estás seguro? El BLOB ya contiene texto que es más grande que el texto que estoy tratando de insertar. Para mí, eso lo convierte en un problema de SQL Developer (interfaz), no en un problema de base de datos. – Xonatron

+0

Podría estar relacionado con el límite máximo de 'utl_i18n.string_to_raw', si hay uno. – Xonatron

Cuestiones relacionadas