Oracle

在 oracle 中使用 json

  • August 25, 2021

有沒有一種在 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 儲存在數據庫中的VARCHAR2CLOBBLOB列中,然後使用JSON 路徑表達式(類似於 XML 的 XPath 表達式)在 SQL 中查詢它。

如果您有 Release 21c,那麼您可以將 JSON 本地儲存為 JSON 數據類型。

您可以使用 SQL 函式**json_value, json_query, and json_table, 和 SQL 條件json_exists**, is json, is not json, and json_textcontains, 來查詢數據。

您可以在數據上定義特定於 JSON 的索引。

函式json_queryjson_table類似於 SQL/XML 標準函式XMLQueryXMLTableXML。條件json_exists類似於XMLExistsXML。

如果您不使用 JSON 數據類型,則需要通過對其定義*is json檢查約束*來確保 JSON 列中的數據實際上是有效的 JSON 數據。

對於版本 12c (12.1.0.2),請參閱Oracle 數據庫中的 JSON。對於版本 21c,請參閱JSON 開發人員指南

(隸屬關係:本人在甲骨文工作。本人在本網站表達的觀點均為本人觀點,不代表甲骨文觀點。)

看看 PL/JSON 項目https://github.com/pljson/pljson

引用自:https://dba.stackexchange.com/questions/7535