12 外部JSONデータのロード

JSONデータのデータベース表を、JSONダンプ・ファイルの内容から作成できます。

このトピックでは、GitHub (https://github.com/oracle/db-sample-schemas/tree/master/order_entry)から取得できるJSONダンプ・ファイルPurchaseOrders.dmpのデータから、JSON文書の全表をロードする方法について説明します。

このファイルには、1行に1つずつJSONオブジェクトが含まれています。この形式には、Oracle NoSQL Databaseなどの一般的なNoSQLデータベースによって作成されるエクスポート形式との互換性があります。

このような外部表は直接問い合せることができます。または、パフォーマンスを向上させるために、異なる行を対象とする複数の問合せがある場合には、外部表のデータから標準のデータベース表をロードできます。

例12-1では、ファイルシステム・ディレクトリ$ORACLE_HOME/demo/schema/order_entryに対応するデータベース・ディレクトリを作成しています。次に、例12-2では、このデータベース・ディレクトリを使用して外部表であるjson_dump_file_contentsを作成し、ダンプ・ファイルPurchaseOrders.dmpのデータを入力しています。これは、すべてのJSON文書を列json_documentにコピーして、外部表にデータを一括で入力します。

次に、例12-4ではINSERTSELECT文として使用して、外部表のJSON文書を、通常のデータベース表j_purchaseorderのJSON列po_documentにコピーします。

外部表のJSON列json_documentBLOB記憶域を選択するため、通常の表の列po_documentも型BLOBにする必要があります。例12-3では、BLOBpo_documentを含めて表j_purchaseorderを作成します。

注意:

データベース・ディレクトリを作成するためには、システム権限CREATE ANY DIRECTORYが必要です。

関連項目:

例12-1 発注書向けのデータベース・ディレクトリ・オブジェクトの作成

次のfolder-containing-dump-fileを、GitHub (https://github.com/oracle/db-sample-schemas/tree/master/order_entry)からダウンロードしたダンプ・ファイルを配置したフォルダに置き換える必要があります。(データベースがそのフォルダにアクセスできる必要があります。)

CREATE OR REPLACE DIRECTORY order_entry_dir
  AS 'folder-containing-dump-file';

例12-2 外部表の作成およびJSONダンプ・ファイルからの入力

CREATE TABLE json_dump_file_contents (json_document BLOB)
  ORGANIZATION EXTERNAL
    (TYPE ORACLE_LOADER
     DEFAULT DIRECTORY order_entry_dir
     ACCESS PARAMETERS
       (RECORDS DELIMITED BY 0x'0A'
        FIELDS (json_document CHAR(5000)))
        LOCATION (order_entry_dir:'PurchaseOrders.dmp'))
  PARALLEL
  REJECT LIMIT UNLIMITED;

例12-3 JSONデータ用のBLOB列を含む表の作成

j_purchaseorderには、主キーidと、BLOBデータ型を使用して格納されているJSON列po_documentがあります。この列に対して、LOBキャッシュ・オプションがオンになっています。

DROP TABLE j_purchaseorder;

CREATE TABLE j_purchaseorder
  (id          VARCHAR2 (32) NOT NULL PRIMARY KEY,
   date_loaded TIMESTAMP (6) WITH TIME ZONE,
   po_document BLOB
   CONSTRAINT ensure_json CHECK (po_document is json))
  LOB (po_document) STORE AS (CACHE);

例12-4 外部表からデータベース表へのJSONデータのコピー

INSERT INTO j_purchaseorder (id, date_loaded, po_document)
  SELECT SYS_GUID(), SYSTIMESTAMP, json_document FROM json_dump_file_contents
    WHERE json_document is json;