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: