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;
/
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
alguna idea sobre cómo hacer esa actualización? – Xonatron
@MatthewDoucette - Actualicé mi respuesta con un ejemplo de la declaración 'UPDATE'. –