2022年7月15日金曜日

ADBに1000列x100行のファイルをアップロードする

 表題の相談があったので、確認のために実施した作業を紹介します。

まずはテストに使用するデータを準備しました。以下のスクリプトを実行しています。

sh csv1000.sh > col1000.csv

macOSで実行したのですが、echoコマンドの動作はシェル組み込みや外部コマンドで異なるようで、OSが違うと期待通りの動作をしないかもしれません。テストに使用するCSVファイルやXLSXファイルは何でも構いません。

上記のシェル・スクリプトを実行して作成したCSVファイルを、新規に作成したExcelファイルにインポートしてcol1000.xlsxファイルを作成しました。このファイルを使って作業を進めます。


APEXのデータ・ワークショップを使う


SQLワークショップデータ・ワークショップを使って、col1000.xlsxをロードしてみます。あらかじめ説明すると、データ・ワークショップで取り込める列数の上限は300です。そのため、col1000.xlsxはロードできません

SQLワークショップユーティリティデータ・ワークショップを開きます。

データのロードを選択します。


ファイルの選択をクリックして、col1000.xlsxを選択します。


データのロードが開きます。ロードされる列を確認するため、構成をクリックします。


ロードする列の表示の一番下を確認します。300列までしか認識されていないことが分かります。

ダイアログを閉じるをクリックします。


300列だけ読み込まれても仕方がないので、取消をクリックします。


別の方法を試します。


APEX_DATA_PARSER.PARSEを呼び出す



先ほどアップロードされたcol1000.xlsxは、APEXの静的ワークスペース・ファイルとして保存されています。そのデータを使って、直接APEX_DATA_PARSER.PARSEを呼び出してみます。

実行するSQLは以下になります。もっとも最近にアップロードされたファイルcol1000.xlsxをロードする対象としています。
create table test_col1000 
as
select * from apex_data_parser.parse(
    p_content => (select document from apex_workspace_files where file_name = 'col1000.xlsx' order by created_on desc fetch first 1 rows only),
    p_skip_rows => 1,
    p_file_name => 'col1000.xlsx'
);
SQLワークショップSQLコマンドより実行します。

データがロードされる表はTEST_COL1000です。


ロードされた列を確認します。

select column_name from user_tab_cols where table_name = 'TEST_COL1000' order by column_name desc;


ロードされている最後の列がCOL300なので、300列までしかロードされていません。

Oracle APEXでは、パッケージAPEX_DATA_PARSERに含まれるプロシージャPARSEが、データ・ロードの基礎です。この上限が300列なので、他のすべての機能も上限は300列になります。

別の方法を試します。


データベース・アクションのデータ・ロードを使用する


APEXのワークスペース・ユーザーにてデータベース・アクションに接続できるよう、準備を行います。

管理者ユーザーADMINにてデータベース・アクションに接続し、管理データベース・ユーザーを開きます。


データベース・ユーザーをAPEXのワークスペース名で検索します。

データベース・ユーザーがひとつ(正確にはWKSP_で始まるユーザーが見つからない)である場合は、ワークスペース・スキーマと管理者ユーザーがひとつのデータベース・ユーザーにて賄われています。


データベース・アクションから接続できるようにするために、操作メニューからRESTの有効化を実行します。


ダイアログが開きます。スキーマ別名のデフォルトはワークスペース名になります。そのまま変更せず、REST対応ユーザーをクリックします。

ここで指定されているスキーマ別名が、データベース・アクションに接続する際に最初に入力するユーザー名になります。


操作メニューから編集を開きます。

データ・ロードを使用するために必要なロールDWROLEを、データベース・ユーザーに割り当てます。

付与されたロールのタブを開き、ロールDWROLE付与済デフォルトチェックを入れます。

以上で、変更の適用をクリックします。


データベース・ユーザーをワークスペース名で検索したときに、WKSP_で始まるユーザーが見つかった場合は、RESTの有効化とロールDWROLEの割り当てWKSP_で始まるデータベース・ユーザーに対して実施します


Autonomous DatabaseのAPEX 22.1からは、ワークスペースの管理者ユーザーの名前は自由に設定できるようになっています。そのため、管理者ユーザーの名前はワークスペース名と一致していないこともあります。

データベース・アクションへサインインする際には、APEXのワークスペースを作成する際に作成した管理者ユーザーのユーザー名とパスワードを使ってサインインします。

管理者ユーザーADMINからサインアウトします。


データベース・アクションサインインします。


ユーザー名
として、ワークスペース・スキーマのORDS別名を入力します。これは通常、ワークスペース名と同じです。

へ進みます。


APEXのワークスペースの管理者ユーザーのユーザー名とパスワードを入力して、サインインします。


データベース・アクションにサインインすると、画面右上に作業を行なうスキーマの名前が表示されます。このスキーマが作業を行なうスキーマになります。これはAPEXのワークスペースにサインインしたときと同じスキーマになります。


ちなみに、APEXでのサインインとは、以下のように対応しています。


サインイン後にSQLワークショップオブジェクト・ブラウザまたはSQLコマンドなどを開くと、デフォルトの作業スキーマを確認できます。

このスキーマは、データベース・アクションにサインインしたときのデフォルトのスキーマと一致します。


データベース・アクションに戻って、データ・ロードを実行します。

データの処理を選択してください。にはデータのロードを選択します。データの場所を選択してください。ではローカル・ファイルを選択します。

へ進みます。


ファイルを選択をクリックし、col1000.xlsxを選択します。


ファイルのアップロードが完了します。鉛筆アイコンクリックします。


マッピングの最後を確認します。1000列すべて認識されています(1000列が上限です)。

表の名前を設定します。この例ではTEST1000としています。

プロパティについては、ロードするファイルの内容に従って、エンコーディングソース列名スキップする行などの調整が必要な場合もあるでしょう。

閉じるをクリックします。


開始アイコンをクリックします。


確認画面がポップアップします。実行をクリックします。


ステータス完了になると、データのロードは完了です。

完了をクリックして、作業を終了します。


作成された表TEST1000は、データベース・アクションSQLナビゲータから確認することもできますし、


APEXのSQLワークショップオブジェクト・ブラウザより確認することもできます。


これでもうまくいかない場合は、DBMS_CLOUD.COPY_DATAを直接呼び出したり、外部表を使うことになるかと思います。それらを使用する方法については、こちらの記事で触れています。

ADBに1000列x100行のファイルをアップロードするために実施した作業の紹介は以上になります。