work with json in oracle work with json in oracle oracle oracle

work with json in oracle


I have started using this library, and it seems promising:https://github.com/pljson/pljson

Easy to install, and the examples are good.

To use the library in your example, add these variables to your procedure..

mapData     json;results     json_list;status      json_value;firstResult json;geometry    json;

....

Then you can manipulate the response as a json object.

-- convert the result from the get to a json object, and show some results.mapData := json(v_ans);-- Show the status of the requeststatus := mapData.get('status');dbms_output.put_line('Status = ' || status.get_string());IF (status.get_string() = 'OK') THEN  results := json_list(mapData.get('results'));  -- Grab the first item in the list  resultObject := json(results.head);  -- Show the human readable address   dbms_output.put_line('Address = ' || resultObject.get('formatted_address').to_char() );  -- Show the json location data   dbms_output.put_line('Location = ' || resultObject.get('geometry').to_char() );END IF;

Running this code will output this to the dbms output:

Status = OKAddress = "St Paul, MN 55105, USA"Location = {  "bounds" : {    "northeast" : {      "lat" : 44.9483849,      "lng" : -93.1261959    },    "southwest" : {      "lat" : 44.9223829,      "lng" : -93.200307    }  },  "location" : {    "lat" : 44.9330076,    "lng" : -93.16290629999999  },  "location_type" : "APPROXIMATE",  "viewport" : {    "northeast" : {      "lat" : 44.9483849,      "lng" : -93.1261959    },    "southwest" : {      "lat" : 44.9223829,      "lng" : -93.200307    }  }}


It should be noted that as of Oracle 12c there is some native support of JSON. However i don't think in the current form it's as useful as the like of PLJSON included in another answer.

To use the feature you create a table with a BLOB, CLOB or Varchar2 field and add a constraint against it "column IS JSON". This enforces JSON syntax checking on that column.

As long as the "IS JSON" constraint is in place you can access the JSON values within using dot notation from SQL. To me, it doesn't seem to provide as powerful manipulation as PLJSON. You can also create an XMLType and then convert to JSON.

Useful links:
Oracle docs
Good tutorial and examples
Tutorial including XML to JSON


I wrote this library : http://reseau.erasme.org/pl-sql-library-for-JSON?lang=en, and this works great to get some json response into a plsql table.

If you only want to extract Oracle data and transform it in Json, this library is a bit "Heavy to use"...I can propose you another code doing it better and faster :

create or replace package jsonfly asprocedure open_object(k varchar2 default null);procedure close_object;procedure open_array (k varchar2 default null);procedure close_array;procedure separation;procedure member(k varchar2, v varchar2);procedure member(k varchar2, n number);procedure send;end;/create or replace package body jsonfly as---------------------------------------------------------------------------------- package pour générer du JSON, envoyé à la volé--------------------------------------------------------------------------------type tCache is table of varchar2(2000) index by binary_integer;g_openBrace         constant varchar2(2) := '{ ';g_closeBrace        constant varchar2(2) := ' }';g_openBracket       constant varchar2(2) := '[ ';g_closeBracket      constant varchar2(2) := ' ]';g_stringDelimiter   constant varchar2(1) := '"';g_Affectation       constant varchar2(3) := ' : ';g_separation        constant varchar2(3) := ', ';g_CR                constant varchar2(1) := Chr(10); -- used to indent the JSON object correctlyg_spc               constant varchar2(2) := '  ';     -- used to indent the JSON object correctlyg_js_comment_open   constant varchar2(20) := '/*-secure-\n'; -- used to prevent from javascript hijackingg_js_comment_close  constant varchar2(20) := '\n*/';          -- used to prevent from javascript hijacking--isObjectOpened  boolean := false;--isArrayOpened   boolean := false;t tCache;i number := 1;---------------------------------------------------------------------------------- --------------------------------------------------------------------------------procedure p(s  varchar2) isbegin    t(i) := s;    i := i + 1;end;---------------------------------------------------------------------------------- --------------------------------------------------------------------------------function encap (s varchar2) return varchar2 isbegin    return g_stringdelimiter || s || g_stringdelimiter;end;---------------------------------------------------------------------------------- --------------------------------------------------------------------------------function encode_string(p_string varchar2) return varchar2 isbegin    return replace(replace(replace(replace(replace(replace(replace(replace(p_string,         '\', '\\'),         '"', '\"'),         '/', '\/'),         chr(8), '\b'),         chr(9), '\t'),         chr(10), '\n'),         chr(12), '\f'),         chr(13), '\r');end;---------------------------------------------------------------------------------- --------------------------------------------------------------------------------procedure open_object(k varchar2 default null) isbegin        if ( k is null ) then         p(g_openbrace);    else         p( encap(k) || g_affectation || g_openbrace);    end if; end;---------------------------------------------------------------------------------- --------------------------------------------------------------------------------procedure close_object isbegin    if (t(i-1) = g_separation) then        i := i - 1;    end if;     p(g_closebrace);    separation();end;---------------------------------------------------------------------------------- --------------------------------------------------------------------------------procedure open_array (k varchar2 default null) isbegin        if ( k is null ) then     p(g_openbracket);    else         p( encap(k) || g_affectation || g_openbracket);    end if; end;---------------------------------------------------------------------------------- --------------------------------------------------------------------------------procedure close_array isbegin    if (t(i-1) = g_separation) then        i := i - 1;    end if;     p(g_closebracket);    separation();end;---------------------------------------------------------------------------------- --------------------------------------------------------------------------------procedure separation isbegin    p(g_separation);end;---------------------------------------------------------------------------------- --------------------------------------------------------------------------------procedure key(k varchar2) isbegin   p( encap(k) || g_affectation);end;---------------------------------------------------------------------------------- --------------------------------------------------------------------------------procedure value(v varchar2) isbegin   p(v);end;---------------------------------------------------------------------------------- --------------------------------------------------------------------------------procedure member(k varchar2, v varchar2) isbegin    p( encap(k) || g_affectation || encap(encode_string(v)));    p(g_separation);end;---------------------------------------------------------------------------------- --------------------------------------------------------------------------------procedure member(k varchar2, n number) isbegin    p( encap(k) || g_affectation || n );    p(g_separation);end;---------------------------------------------------------------------------------- --------------------------------------------------------------------------------procedure send isbegin    if (t(i-1) = g_separation) then        t.delete(i-1);    end if;     i := t.first;    while (i is not null) loop        htp.p(t(i));        i := t.next(i);    end loop;end;end jsonfly;/