2021年2月25日木曜日

JSONのサンプル・データをAlways Freeの21cに取り込む

21cの新機能であるネイティブJSON型の動作確認をするために、Oracle Databaseのサンプル・スキーマに含まれるJSONデータをロードしました。その作業記録です。

[2024年8月28日 Always Freeの23aiでの作業で更新しています。]

Oracle Databaseのサンプル・スキーマのorder_entryに、JSONのサンプル・データであるPurchaseOrders.dmpが含まれています。



PurchaseOrders.dmpを開き、PurchaseOrders.dmpRawを開きます。


PurchaseOrders.dmpの内容であるJSONデータが表示されます。後で使用するため、このURLをコピーして保存します。

https://raw.githubusercontent.com/oracle-samples/db-sample-schemas/main/order_entry/PurchaseOrders.dmp


管理者ユーザーであるADMINにて、データベース・アクションにサインインします。

作業を行なうAPEXワークスペース・スキーマへ、パッケージDBMS_CLOUDの実行権限ディレクトリDATA_PUMP_DIRの操作権限を与えます。

grant execute on dbms_cloud to [APEXワークスペース・スキーマ];
grant all on directory data_pump_dir to [APEXワークスペース・スキーマ];

SQLワークシートから実行します。


以降はAPEXのSQLコマンドより作業を行います。

GitHubにあるPurchaseOrders.dmpを、ディレクトリDATA_PUMP_DIR以下に取得します。
begin
    dbms_cloud.get_object
    (
        object_uri => 'https://raw.githubusercontent.com/oracle-samples/db-sample-schemas/main/order_entry/PurchaseOrders.dmp',
        directory_name => 'DATA_PUMP_DIR'
    );
end;

 ディレクトリDATA_PUMP_DIRの内容をリストし、ファイルが取得できていることを確認します。
SELECT * FROM DBMS_CLOUD.LIST_FILES('DATA_PUMP_DIR');

JSONデータを読み込む表J_PURCHASEORDERを作成します。今回はネイティブJSON型の確認を行うため、列PO_DOCUMENTの型をJSONとして指定します。
CREATE TABLE j_purchaseorder
(
	id          VARCHAR2 (32) NOT NULL PRIMARY KEY,
	date_loaded TIMESTAMP (6) WITH TIME ZONE,
	po_document JSON
);

データを取り込む表が作成されたので、以下のPL/SQLスクリプトでファイルの内容を表に書き込みます。
DECLARE 
  V1 VARCHAR2(32767); 
  F1 UTL_FILE.FILE_TYPE;
  c integer := 0;
BEGIN 
  F1 := UTL_FILE.FOPEN('DATA_PUMP_DIR','PurchaseOrders.dmp','R',3000); 
  loop
      begin
          UTL_FILE.GET_LINE(F1,V1,3000);
          -- dbms_output.put_line(substr(v1,1,80));
          insert into j_purchaseorder(id, date_loaded, po_document) values(sys_guid(), systimestamp, v1);
          c := c + 1;
      exception
          when UTL_FILE.READ_ERROR or no_data_found then
      		utl_file.fclose(f1);
            exit;
      end;
  end loop;
  dbms_output.put_line('Read = ' || c);
  commit;
END;

10000行読み込まれていれば、完了です。以下のようなJSONの内容を表示するSQLを実行して、確認してみましょう。
select json_value(po.po_document, '$.PONumber') from j_purchaseorder po;


以上になります。