19 Oracle SQL Function JSON_SERIALIZE
Oracle SQL function json_serialize
takes JSON data (of
any SQL data type) as input and returns a textual representation of it.
Function json_serialize
is not itself a query function, but
it is typically used to transform the result of a query. It supports an error clause and
a returning clause.
You can use json_serialize
to convert binary JSON data to
textual form (CLOB
or VARCHAR2
), or to transform
textual JSON data by pretty-printing it or escaping non-ASCII Unicode characters in it.
An important use case is serializing JSON data that is stored in a BLOB
column. A BLOB
result is in the AL32UTF8 character set. But whatever
the data type returned by json_serialize
, the returned data represents
textual JSON data..
Example 19-1 Using JSON_SERIALIZE To Convert BLOB Data To Pretty-Printed Text
This example serializes and pretty-prints the JSON purchase order that
has 1600
as the value of field PONumber
data,
which is selected from column po_document
of table
j_purchaseorder
The return-value data type is
VARCHAR2(4000)
(the default return type).
Example 4-2 shows the insertion of such purchase-order data into a
VARCHAR2
table. But json_serialize
is
especially useful for serializing BLOB
data. See Example 9-1 for how to create a table with a BLOB
column of
JSON
data.
SELECT json_serialize(po_document, PRETTY) FROM j_purchaseorder;
Example 19-2 Using JSON_SERIALIZE with Clients
If you use json_serialize
to return
serialized query data to a client such as Oracle Call Interface (OCI) or Java
Database Connectivity (JDBC) in LOB batches, there are some optimizations in
particular to
consider:
-
Use the LOB data API. In Java, this means use methods
getBytes()
andgetString()
, forBLOB
andCLOB
data, respectively. -
Set the LOB prefetch size to a large number, such as 65 KB.
-
Free the fetched LOB after each row is read.
Otherwise, performance can be reduced, and memory can leak. This example illustrates how to do this.
Statement stmt = conn.createStatement(); // conn is a java.sql.Connection
stmt.setFetchSize(1000); // Set batch fetch size to 1 KB
// set LOB prefetch size to be 65 KB
((OraclePreparedStatement)stmt).setLobPrefetchSize(65000);
// Query the JSON data in column jdoc of table myTab, returning JSON as a BLOB instance
rset = stmt.executeQuery(
"SELECT id, json_serialize(jdoc RETURNING BLOB) FROM myTab");
while (rset.next()) { // Iterate over the returned rows
Blob blob = rset.getBlob (2);
// Do something with the BLOB instance for the row
blob.free(); // Free the LOB at the end of each iteration
}
rset.close();
Related Topics
Parent topic: Query JSON Data