在 oracle 中使用 json
有沒有一種在 Oracle 中使用 JSON 的簡單方法?我有一個儲存過程,我經常使用它來呼叫 Web 服務,JSON 是我在 Web 開發環境中熟悉的一種格式,但是在儲存過程中使用 JSON 的最佳方式是什麼?例如,從 URI 中獲取 CLOB 響應,將其轉換為 JSON 對象並從中獲取值?
作為參考,這是我用來獲取 URL 的過程
create or replace procedure macp_URL_GET(url_resp in out clob, v_url in varchar2) is req Utl_Http.req; resp Utl_Http.resp; NAME VARCHAR2 (255); VALUE VARCHAR2 (1023); v_msg VARCHAR2 (80); v_ans clob; -- v_url VARCHAR2 (32767) := 'http://www.macalester.edu/'; BEGIN /* request that exceptions are raised for error Status Codes */ Utl_Http.set_response_error_check (ENABLE => TRUE ); /* allow testing for exceptions like Utl_Http.Http_Server_Error */ Utl_Http.set_detailed_excp_support (ENABLE => TRUE ); /* Utl_Http.set_proxy ( proxy => 'www-proxy.us.oracle.com', no_proxy_domains => 'us.oracle.com' ); */ req := Utl_Http.begin_request (url => v_url, method => 'GET'); /* Alternatively use method => 'POST' and Utl_Http.Write_Text to build an arbitrarily long message */ /* Utl_Http.set_authentication ( r => req, username => 'SomeUser', PASSWORD => 'SomePassword', scheme => 'Basic', for_proxy => FALSE --this info is for the target Web server ); */ Utl_Http.set_header (r => req, NAME => 'User-Agent', VALUE => 'Mozilla/4.0'); resp := Utl_Http.get_response (r => req); /* DBMS_OUTPUT.put_line ('Status code: ' || resp.status_code); DBMS_OUTPUT.put_line ('Reason phrase: ' || resp.reason_phrase); FOR i IN 1 .. Utl_Http.get_header_count (r => resp) LOOP Utl_Http.get_header (r => resp, n => i, NAME => NAME, VALUE => VALUE); DBMS_OUTPUT.put_line (NAME || ': ' || VALUE); END LOOP; */ --test BEGIN LOOP Utl_Http.read_text (r => resp, DATA => v_msg); --DBMS_OUTPUT.put_line (v_msg); v_ans := v_ans || v_msg; url_resp := url_resp || v_msg; END LOOP; EXCEPTION WHEN Utl_Http.end_of_body THEN NULL; END; --test Utl_Http.end_response (r => resp); --url_resp := v_ans; EXCEPTION /* The exception handling illustrates the use of "pragma-ed" exceptions like Utl_Http.Http_Client_Error. In a realistic example, the program would use these when it coded explicit recovery actions. Request_Failed is raised for all exceptions after calling Utl_Http.Set_Detailed_Excp_Support ( ENABLE=>FALSE ) And it is NEVER raised after calling with ENABLE=>TRUE */ WHEN Utl_Http.request_failed THEN DBMS_OUTPUT.put_line ( 'Request_Failed: ' || Utl_Http.get_detailed_sqlerrm ); url_resp :='Request_Failed: ' || Utl_Http.get_detailed_sqlerrm; /* raised by URL http://xxx.oracle.com/ */ WHEN Utl_Http.http_server_error THEN DBMS_OUTPUT.put_line ( 'Http_Server_Error: ' || Utl_Http.get_detailed_sqlerrm ); url_resp := 'Http_Server_Error: ' || Utl_Http.get_detailed_sqlerrm; /* raised by URL http://otn.oracle.com/xxx */ WHEN Utl_Http.http_client_error THEN DBMS_OUTPUT.put_line ( 'Http_Client_Error: ' || Utl_Http.get_detailed_sqlerrm ); url_resp := 'Http_Client_Error: ' || Utl_Http.get_detailed_sqlerrm; /* code for all the other defined exceptions you can recover from */ WHEN OTHERS THEN DBMS_OUTPUT.put_line (SQLERRM); url_resp := SQLERRM; END;
然後進行測試
begin macp_url_get(url_resp => :url_resp, 'http://maps.googleapis.com/maps/api/geocode/json?address=55105&sensor=false'); end;
(我知道 googleapi 將允許 xml 響應,但我經常使用其他預設為 JSON 的 Web API)
如果您擁有 Oracle Database Release 12c Release 1 (12.1.0.2),那麼您可以將 JSON 儲存在數據庫中的
VARCHAR2
、CLOB
或BLOB
列中,然後使用JSON 路徑表達式(類似於 XML 的 XPath 表達式)在 SQL 中查詢它。如果您有 Release 21c,那麼您可以將 JSON 本地儲存為 JSON 數據類型。
您可以使用 SQL 函式**
json_value
,json_query
, andjson_table
, 和 SQL 條件json_exists
**,is json
,is not json
, andjson_textcontains
, 來查詢數據。您可以在數據上定義特定於 JSON 的索引。
函式
json_query
和json_table
類似於 SQL/XML 標準函式XMLQuery
和XMLTable
XML。條件json_exists
類似於XMLExists
XML。如果您不使用 JSON 數據類型,則需要通過對其定義*
is json
檢查約束*來確保 JSON 列中的數據實際上是有效的 JSON 數據。對於版本 12c (12.1.0.2),請參閱Oracle 數據庫中的 JSON。對於版本 21c,請參閱JSON 開發人員指南。
(隸屬關係:本人在甲骨文工作。本人在本網站表達的觀點均為本人觀點,不代表甲骨文觀點。)
看看 PL/JSON 項目https://github.com/pljson/pljson