処理時間が短い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のマニュアルはこちらになります。
完