はじめに
この記事では、USの祝日の情報が格納されているJSONデータ(https://date.nager.at/api/v3/PublicHolidays/2024/US) をAutonomous Database内に格納する手順をご紹介します。
下記のようにデータが格納されています。
[
{
"date": "2024-01-01",
"localName": "New Year's Day",
"name": "New Year's Day",
"countryCode": "US",
"fixed": false,
"global": true,
"counties": null,
"launchYear": null,
"types": [
"Public"
]
},
{
"date": "2024-01-15",
"localName": "Martin Luther King, Jr. Day",
"name": "Martin Luther King, Jr. Day",
"countryCode": "US",
"fixed": false,
"global": true,
"counties": null,
"launchYear": null,
"types": [
"Public"
]
},
{
"date": "2024-02-12",
"localName": "Lincoln's Birthday",
"name": "Lincoln's Birthday",
"countryCode": "US",....
オープンデータをDBに格納する
オープンデータに対するアクセスを許可
- Autonomous DatabaseにADMINユーザーとして接続します。
- 接続をしたら、オープンデータに対するアクセスを許可します。
BEGIN DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE( host => 'date.nager.at', ace => xs$ace_type( privilege_list => xs$name_list('http'), principal_name => 'ADMIN', principal_type => xs_acl.ptype_db ) ); END; /
表の作成
- JSONデータを格納する表を作成します。
CREATE TABLE us_holidays ( id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, json_data CLOB CHECK (json_data IS JSON) );
オープンデータからJSONデータを取得をして表に格納
-
JSONデータを取得して、表に格納します。
SET SERVEROUTPUT ON DECLARE v_req UTL_HTTP.req; v_resp UTL_HTTP.resp; v_clob CLOB; v_buffer VARCHAR2(32767); BEGIN v_req := UTL_HTTP.begin_request('https://date.nager.at/api/v3/PublicHolidays/2024/US', 'GET'); v_resp := UTL_HTTP.get_response(v_req); -- CLOB を初期化 v_clob := ''; -- レスポンスを読み取る BEGIN LOOP UTL_HTTP.read_text(v_resp, v_buffer, 32767); v_clob := v_clob || v_buffer; END LOOP; EXCEPTION WHEN UTL_HTTP.end_of_body THEN NULL; -- 正常終了 END; -- レスポンスをクローズ UTL_HTTP.end_response(v_resp); -- 取得したデータを表示 DBMS_OUTPUT.PUT_LINE(DBMS_LOB.SUBSTR(v_clob, 4000, 1)); END; /
-
これでオープンデータを取得し、DBに格納することができました。
表形式で見やすく表示
JSON_TABLE関数を使って、一部のデータを表形式で見てみます。
SET LINESIZE 200
SET PAGESIZE 50
SET WRAP OFF
SET TRIMSPOOL ON
COLUMN Holiday_Date FORMAT A12 HEADING 'Date'
COLUMN Local_Name FORMAT A25 HEADING 'Local Name'
COLUMN English_Name FORMAT A25 HEADING 'English Name'
COLUMN Country_Code FORMAT A5 HEADING 'Code'
COLUMN Is_Fixed FORMAT A5 HEADING 'Fixed'
COLUMN Is_Global FORMAT A5 HEADING 'Global'
-- データ表示
SELECT
jt."date" AS Holiday_Date,
jt."localName" AS Local_Name,
jt."name" AS English_Name,
jt."countryCode" AS Country_Code,
jt."fixed" AS Is_Fixed,
jt."global" AS Is_Global
FROM us_holidays u,
JSON_TABLE(
u.json_data FORMAT JSON, '$[*]'
COLUMNS (
"date" VARCHAR2(20) PATH '$.date',
"localName" VARCHAR2(100) PATH '$.localName',
"name" VARCHAR2(100) PATH '$.name',
"countryCode" VARCHAR2(10) PATH '$.countryCode',
"fixed" VARCHAR2(10) PATH '$.fixed',
"global" VARCHAR2(10) PATH '$.global'
)
) jt
ORDER BY Holiday_Date;
* 以下のように出力されます。
```
Date Local Name English Name Code Fixed Globa
------------ ------------------------- ------------------------- ----- ----- -----
2024-01-01 New Year's Day New Year's Day US false true
2024-01-15 Martin Luther King, Jr. D Martin Luther King, Jr. D US false true
2024-02-12 Lincoln's Birthday Lincoln's Birthday US false false
2024-02-19 Washington's Birthday Presidents Day US false true
2024-03-29 Good Friday Good Friday US false false
2024-03-29 Good Friday Good Friday US false false
2024-05-08 Truman Day Truman Day US false false
2024-05-27 Memorial Day Memorial Day US false true
2024-06-19 Juneteenth National Indep Juneteenth National Indep US false true
2024-07-04 Independence Day Independence Day US false true
2024-09-02 Labour Day Labor Day US false true
2024-10-14 Columbus Day Columbus Day US false false
2024-10-14 Indigenous Peoples' Day Indigenous Peoples' Day US false false
2024-11-11 Veterans Day Veterans Day US false true
2024-11-28 Thanksgiving Day Thanksgiving Day US false true
2024-12-25 Christmas Day Christmas Day US false true
16 rows selected.
SQL>
```