Step 1: Make the RESTful Service.
The only catch is to turn pagination off ( make it zero ). I didn't need it for now so this code that follows doesn't account for it.
Step 2. Install PL/JSON
In the future this can be done with built in support for JSON in the database.
Step 3. Glue code.
declare -- APEX g_collection_name varchar2(32767) := 'json_data'; -- JSON Portion l_url varchar2(32767) := 'http://myhost.mydomain.com/apex/dbtools/features/latestRequests'; l_jsonObj json; l_jsonObj2 json; l_jsonKeys json_list; l_key varchar2(32767); l_value varchar2(32767); l_tempdata json_value; l_temparray json_list; i number; ii number; values_array dbms_sql.varchar2_table; procedure varray2collection(p_values dbms_sql.varchar2_table) as l_sql varchar2(32767) := 'begin APEX_COLLECTION.ADD_MEMBER (p_collection_name =>:NAME,'; i number; c number; ret number; begin -- build up the begin..end sql block for i in 1..p_values.count loop l_sql := l_sql || 'p_c00'|| i ||'=>:c'||i||','; end loop; -- chop off the last comma l_sql := substr(l_sql,1,length(l_sql)-1); -- add the end l_sql := l_sql || '); end;'; dbms_output.put_line('SQL='||l_sql); c := DBMS_SQL.OPEN_CURSOR; dbms_output.put_line('c='||c); dbms_sql.parse(c,l_sql,dbms_sql.native); -- bind in the collection name dbms_sql.bind_variable(c,':NAME'||i,g_collection_name); -- bind in the values for i in 1..p_values.count loop dbms_sql.bind_variable(c,':c'||i,p_values(i)); end loop; ret := dbms_sql.execute(c); dbms_sql.close_cursor(c); exception when others then dbms_sql.close_cursor(c); end; -- simple function to remove the leading and trailing " function trimQuotes(s varchar2) return varchar2 is l_value varchar2(32767); begin l_value := substr(s,2); l_value := substr(l_value,1,length(l_value)-1); return l_value; end; -- function to grab the URL and return a JSON object function getURL(p_url varchar2) return JSON is -- HTTP Portion l_http_request UTL_HTTP.req; l_http_response UTL_HTTP.resp; l_clob CLOB; l_text VARCHAR2(32767); begin -- Initialize the CLOB. DBMS_LOB.createtemporary(l_clob, FALSE); -- Make a HTTP request and get the response. l_http_request := UTL_HTTP.begin_request(l_url); l_http_response := UTL_HTTP.get_response(l_http_request); -- Copy the response into the CLOB. BEGIN LOOP UTL_HTTP.read_text(l_http_response, l_text, 32766); DBMS_LOB.writeappend (l_clob, LENGTH(l_text), l_text); END LOOP; EXCEPTION WHEN UTL_HTTP.end_of_body THEN null; END; UTL_HTTP.END_RESPONSE(l_http_response); -- Relase the resources associated with the temporary LOB. dbms_output.put_line('Length:'|| DBMS_LOB.getlength(l_clob)); return json(l_clob); end geturl; BEGIN -- apex collection APEX_COLLECTION.CREATE_OR_TRUNCATE_COLLECTION(g_collection_name); -- JSON l_jsonObj := getURL(l_url); -- grab the items l_temparray:= json_list(l_jsonObj.get('items')); -- temparray := json_list(tempdata); dbms_output.put_line( 'Count:'|| l_temparray.count); for i in 1..l_temparray.count loop -- get the Nth item l_tempdata := l_temparray.get(i); dbms_output.put_line( 'Record['|| i||']:'|| l_tempdata.to_char); -- bring the Nth item into it's own json object l_jsonObj2 := json(l_tempdata); -- get all the keys to walk l_jsonKeys := l_jsonobj2.get_keys(); for ii in 1..l_jsonKeys.count loop l_key := trimQuotes(l_jsonKeys.get(ii).to_char); l_value := trimQuotes(l_jsonObj2.get(l_key).to_char); dbms_output.put_line(l_key || '=' ||l_value); -- build up the array to pass to the apex collection values_array(ii) := l_value; end loop; dbms_output.put_line('LENGTH:'||values_array.count); -- send it to the collection varray2collection(values_array); end loop; end; /
Step 4. Make a page in Application Express
The glue code is in the process named Get JSON.
The interactive report is simply: select * from apex_collections.
Step 5. It's alive
Oh the ā'pěks is from the oraclenerd store. If you don't have a shirt already, you should.