2012-02-09 59 views
8

¿Cómo edito BLOB (que contiene texto JSON) en Oracle SQL Developer?¿Cómo edito BLOB (que contiene JSON) en Oracle SQL Developer?

Puedo abrirlos y verlos, pero ¿necesito un editor externo para editarlos? Cualquier ayuda sobre qué usar, incluso si solo es una libreta, y cómo hacerlo sería muy apreciada en la respuesta.

EDITAR: Los BLOB en cuestión contienen texto JSON.

Respuesta

7

Si ejecuta una consulta en SQL Developer 3.1 (y probablemente versiones anteriores) que devuelve un BLOB, puede hacer doble clic en el BLOB particular que le interese donde se le solicitará que intente enviarlo los datos a un editor externo o para intentar que el control integrado de visualización de SQL Developer intente interpretar los datos como una imagen o como texto. Sus datos JSON probablemente se mostrarán correctamente si elige la opción de texto.

Si desea cambiar los datos, sin embargo, tendrá que emitir un UPDATE para establecer realmente los datos. SQL Developer no tiene la funcionalidad para editar directamente los datos LOB. Por ejemplo

UPDATE table_name 
    SET column_with_json_data = 
      utl_i18n.string_to_raw('{"foo": {"id": "1", "value": "2"}}') 
WHERE primary_key = <<some value>> 

actualizará la fila especificada con los nuevos datos JSON codificados utilizando el conjunto de caracteres de la base de datos. Si desea almacenar los datos en algún otro conjunto de caracteres, string_to_raw toma un segundo parámetro opcional que especifica el conjunto de caracteres. Así que si desea almacenar los datos utilizando el conjunto de caracteres UTF-8, que haría algo como esto

UPDATE table_name 
    SET column_with_json_data = 
      utl_i18n.string_to_raw('{"foo": {"id": "1", "value": "2"}}', 'AL32UTF8') 
WHERE primary_key = <<some value>> 

Por supuesto, ya que los datos JSON es textual, que sería mucho mejor almacenar los datos en un CLOB que está diseñado para almacenar objetos grandes de caracteres. Entonces SQL Developer (y otras herramientas) podrían simplemente mostrar el texto en lugar de requerir que selecciones el resultado y luego tomar acciones adicionales para convertirlo a texto. Y no tendría que convertir los datos a RAW para actualizar los datos en la base de datos.

Si los datos son demasiado largos para string_to_raw de manejar (que depende del conjunto de caracteres y los datos, sino que ocurrirá en cualquier momento los datos RAW supera 2000 bytes), puede almacenar los datos en un CLOB y luego convertir eso en a BLOB que usa para actualizar la tabla. Eso es un poco más complejo, pero es más flexible. En este ejemplo, relleno los datos JSON a 3200 caracteres con un '*': obviamente, los datos de prueba ya no son válidos para JSON, pero eso no es importante a los fines de esta pregunta.

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); 

    -- You'll want to add a WHERE clause as well 
    update json_data 
    set data = l_blob; 

    dbms_lob.freeTemporary(l_blob); 
end; 
/
+0

Ok, he editado el BLOB y tengo el texto que desearía que fuera. ¿Cómo realizo el 'UPDATE' con este archivo de texto? ¡Conéctame aquí y sabré cómo hacerlo todo! – Xonatron

+0

alguna idea sobre cómo hacer esa actualización? – Xonatron

+0

@MatthewDoucette - Actualicé mi respuesta con un ejemplo de la declaración 'UPDATE'. –

Cuestiones relacionadas