miércoles, 21 de agosto de 2019

Oracle 19c - Nueva Función JSON_SERIALIZE


Oracle 19c introduce algunas mejoras significativas en el manejo de datos en formato JSON. En este artículo en particular voy a explicar el funcionamiento de la función JSON_SERIALIZE.

La misma nos permite convertir un documento JSON, cualquiera sea su formato (BLOB, RAW, CLOB) en texto

La sintaxis de la función es la siguiente:
JSON_SERIALIZE (target_expr [ json_query_returning_clause ] [ PRETTY ]
                [ ASCII ] [ TRUNCATE ] [ json_query_on_error_clause ])
  • La cláusula "RETURNING" así como las opciones “PRETTY”, “ASCII” y “TRUNCATE” se comportan igual a lo visto en la función JSON_MERGEPATCH.
  • La función JSON_SERIALIZE permite el uso de la clausula “ON ERROR” para definir que comportamiento tomar en caso de que encuentre un error al ejecutarse.
  • Al igual que la función “TREAT(… AS JSON)” y "JSON_ MERGEPATCH", es una función SQL que no puede emplearse en forma directa en PL/SQL.

Ejemplos de Uso:

Primero, vamos a crear una tabla conteniendo algunos documentos JSON sencillos en una columna BLOB:
CREATE TABLE BLOBJSON ( 
      ID NUMBER(10) NOT NULL, 
      Datos BLOB, 
      CONSTRAINT PK_BLOBJSON PRIMARY KEY (ID),
      CONSTRAINT CK_BLOBJSON_DatosJSON CHECK(Datos IS JSON)
);
INSERT INTO BLOBJSON VALUES (1, '{"marca":"Ford", "modelo":"Mustang", "cantidad":3}');
INSERT INTO BLOBJSON VALUES (2, '{"marca":"Chevrolet", "modelo":"Camaro", "cantidad":5}');
INSERT INTO BLOBJSON VALUES (3, '{"marca":"Dodge", "modelo":"Charger", "cantidad":1}');
--
COMMIT;

Si queremos consultar los datos, no podemos hacerlo ya que se encuentran en formato binario:


Si los datos no son muy grandes, se puede usar la función "UTL_RAW.cast_to_varchar2"para realizar la conversion:
SELECT UTL_RAW.cast_to_varchar2(Datos) AS data2 FROM BLOBJSON;
Y el resultado que obtenemos es el siguiente:


Otra opción es utilizar la función JSON_QUERY para ver el contenido:
SELECT JSON_QUERY(Datos, '$') AS data FROM BLOBJSON;
Y el resultado que obtenemos es el siguiente:

O directamente utilizar la nueva función (en este caso, adicionalmente estamos filtrando la consulta para ver solo un registro):
SELECT JSON_SERIALIZE(d.Datos PRETTY) AS data
FROM   BLOBJSON d
WHERE  d.datos.marca = 'Dodge';
Y el resultado que obtenemos es el siguiente:












No hay comentarios.:

Publicar un comentario