2021年2月25日木曜日

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

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

最初にOracle Databaseのサンプル・スキーマをGitHubからダウンロードします。

https://github.com/oracle/db-sample-schemas

サンプル・スキーマには以下のファイルが含まれています。

db-sample-schemas-master/order_entry/PurchaseOrders.dmp

このファイルがJSONのデータなので、このファイルをロードします。

OCIのコンソールより、オブジェクト・ストレージを呼び出します。


オブジェクト・ストレージの画面が開いたら、バケットの作成を行います。


バケット名は任意ですが、今回はJSONとします。それ以外はデフォルトのままで、作成します。


バケットが作成されたら、作成されたバケット名(今回はJSON)のリンクをクリックして開きます。


可視性の編集をクリックして、設定を変更します。


可視性はパブリックにします。JSONデータの取り込みが済んだら、作成したバケットは削除しましょう。


オブジェクトのアップロードをクリックし、サンプル・スキーマに含まれているPurchaseOrders.dmpをアップロードします。


ファイルを選択し、アップロードを実行します。


アップロードが終了済になったらパネルを閉じます。


アップロードされたオブジェクトのURLパス(URI)を確認するために、一番右のメニューから、オブジェクト詳細の表示を実行します。


URLパス(URI)をコピーしておきます。


以降の作業は、 SQL Developer Webから行います。ユーザーは管理者ユーザーであるADMINにてサインインします

SQLワークシートを開きます。

最初にオブジェクト・ストレージにあるPurchaseOrders.dmpをディレクトリDATA_PUMP_DIR以下に取得します。
begin
    dbms_cloud.get_object
    (
        object_uri => 'https://objectstorage.us-ashburn-1.oraclecloud.com/n/id9korehachigauyo/b/JSON/o/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;


以上になります。