2022年4月4日月曜日

CSVファイルをオブジェクト・ストレージを介して表にインポートするアプリ

 処理時間が短いDBMS_CLOUD.COPY_DATAを使って、CSVファイルをデータベースにインポートするAPEXアプリケーションを作成してみます。

こちらの記事(とこちらの記事)と同じ環境で作業を行います。

作成されるアプリケーションは以下のような動作をします。アップロードしているCSVファイルは1000万行、圧縮したサイズは41MB、非圧縮で834MBのサイズです。ファイルのアップロードから表へのインポートが完了するまで、処理時間は大体50秒です。


以下よりアプリケーションの作成手順を紹介します。

アプリケーション作成ウィザードを実行し、空のアプリケーションを作成します。

名前はCSVファイルのロードとし、アプリケーションの作成を実行します。


アプリケーションが作成されます。すべての機能をホーム・ページに実装します。

ページ・デザイナにてホーム・ページを開きます。


Bodyの位置に、新規にリージョンを作成します。

識別タイトルBRICKS_IMPタイプとして対話モード・レポートを選択します。ソース表名BRICKS_IMPを指定します。


対話モード・レポートのリージョンに、オブジェクト・ストレージ上のアップロード先となる、リージョンネームスペースおよびバケットを指定するページ・アイテムP1_REGIONP1_NAMESPACEおよびP1_BUCKETを作成します。また、CSVファイルを選択するページ・アイテムP1_FILEも作成します。

ページ・アイテムを作成し、識別名前P1_REGIONとします。タイプテキスト・フィールドラベルリージョンです。


同様にページ・アイテムP1_NAMESPACEを作成します。ラベルネームスペースとします。


ページ・アイテムP1_BUCKETを作成します。ラベルバケットとします。


アップロードするCSVファイルを選択するページ・アイテムP1_FILEを作成します。

識別名前P1_FILEタイプとしてファイル参照...を選択します。ラベルアップロードするCSVファイル(圧縮)とします。

設定ドロップゾーンのタイトルファイルを選択する記憶域タイプはデフォルトのTable APEX_APPLICATION_TEMP_FILESのままとします。APEXが提供している表を使うので、ファイルを保存するための表を用意する手間が省けます。最大ファイル・サイズ100000とします。(100MBが上限となる)


ファイルのアップロードを実行するボタンを作成します。

識別名前B_UPLOADラベルアップロードとします。動作アクションはデフォルトのページの送信のままとします。


ボタンを押したときに実行されるプロセスを作成します。

左ペインでプロセス・ビューを表示させ、プロセスの作成を実行します。

識別名前CSVファイルのロードタイプとしてコードの実行を選択します。ソースPL/SQLコードには以下を記述します。

サーバー側の条件ボタン押下時B_UPLOADを指定します。


以上でアプリケーションは完成です。アプリケーションを実行すると、最初のGIF動画のような動作になります。

今回作成したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/csv-import-from-object-storage.sql

Oracle APEXのアプリケーション作成の参考になれば幸いです。

追記

オブジェクト・ストレージを操作するOCI PL/SQL SDKを使うと、以下のようなコードになります。

処理時間にそれほど違いはないようです。APIキーの準備などが必要ですが、PL/SQL SDKも充実してきています。PL/SQL SDKのマニュアルはこちらになります。