2022年4月4日月曜日

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

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

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

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


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

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

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


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

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


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

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


対話モード・レポートのリージョンに、オブジェクト・ストレージ上のアップロード先となる、リージョン、ネームスペースおよびバケットを指定するページ・アイテムP1_REGION、P1_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のマニュアルはこちらになります。

完