Oracle Cloud Infrastracture（OCI）の Autonomous Database に、特殊文字で区切られたデータをオブジェクト・ストレージから GUI操作でロードしてみる

Oracle Cloud Infrastructure（以下「OCI」）では、運用管理はもちろん性能の最適化までカバーしたフル・マネージド型データベースである Autonomous Database（以下「ADB」）を提供しています。（ADBには 分析（DWH）に特化した Autonomous Data Warehouseと、OLTPや混合ワークロード用のAutonomous Transaction Proccessingの2種類があります）

運用管理や性能最適化までクラウド側に任せられるという特長から、社内のIT部門を介さずに事業部門（営業部門、開発部門、製造部門、マーケティング部門....）で独自に利用されるケースも増えてきているようです。

そんな中で「データロードをいかに高速かつ簡単に行うか？」がけっこうポイントになります。
IT部門が絡んでいる場合は「このコマンド投げてください」ということで事足りますが、事業部門の場合は「できればGUIで簡単に....」ということになります。

前置きが長くなりましたが、今回は ADBに特殊文字で区切られたデータをオブジェクト・ストレージから GUI操作で高速にロードする方法について記載してみたいと思います。

### 1.ツールの選定

ADBに GUI操作でデータロードする方法としては、以下の3つの方法が考えられます。

・ADB附属のAPEXの利用
・ADBのデータベース・アクションの利用
・SQL Developerの利用

調べてみると、APEXやデータベース・アクションでは区切り文字が決められた文字（カンマ、コロン、タブなど）からの選択となっており、選択肢にない文字で区切られたデータはロードできなさそうです。

SQL Developerでは、区切り文字を入力できるようになっているため、今回はSQL Developerを利用してデータロードをしてみることにします。

### 2.事前準備

事前準備としては、以下のような作業が必要となります。（いづれも、1度きりの作業です）

・PCへの SQL Developerのインストール
・リージョン設定
・コンパートメント作成
・ADBインスタンスの作成
・SQL Developerからの接続
・データベース・ユーザーの作成
・クレデンシャル情報の登録

事前準備について、すべての手順を詳細に記載すると冗長になってしまうため（この記事の本来の目的はロード手順です）、事前準備についてはオラクル社の「Autonomous Databaseハンズオンラボ（以下「ハンズオンラボ」）をガイドする形で記載していきます。
https://community.oracle.com/tech/welcome/discussion/4474304/autonomous-database-%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3%E3%83%A9%E3%83%9C-adb-hol#latest

#### 2-1.PCへの SQL Developerのインストール

SQL Developerは以下のページよりダウンロード可能です。
https://www.oracle.com/jp/tools/downloads/sqldev-downloads.html
PCの OSに対応した SQL Developerをダウンロードしてインストールします。

#### 2-2.リージョン設定、コンパートメント作成

ハンズオンラボの以下のページを参考に作業を進めます。
https://community.oracle.com/tech/welcome/discussion/4474309
※メニュー構造や一部画面は変更になっているものがあります。

#### 2-3.ADBインスタンスの作成、SQL Developerからの接続、データベース・ユーザーの作成

ハンズオンラボの以下のページを参考に作業を進めます。
https://community.oracle.com/tech/welcome/discussion/4474286
※メニュー構造や一部画面は変更になっているものがあります。

#### 2-4.クレデンシャル情報の登録

オブジェクト・ストレージからデータロードを行うには、ADBがオブジェクト・ストレージを参照できるように、ADBに資格情報（クレデンシャル）を登録する必要があります。

<b>1）認証トークンの取得</b>

オブジェクト・ストレージを操作する OCIユーザーでクラウドコンソールにサインインし、右上のプロファイル・アイコンをクリックし、「ユーザー設定」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/54ba5559-df55-f651-5e59-1da05d6b0c5e.png)

画面左下メニューより「認証トークン」を選択し、［トークンの生成］ボタンを押します。

トークンの生成ダイアログで説明を入力し、［トークンの生成］ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/41163e82-096e-d82c-93ae-3251d4360576.png)

生成されたトークンは一度きりしか表示されないため、コピーしてテキストファイル等に保管しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/c6720d54-afa6-1b01-20f1-26e9f6873e73.png)

<b>2）クレデンシャル情報の登録</b>

SQL Developerより、2-3.で作成したデータベース・ユーザーでADBにログインします。（ADMINユーザーではありません）

DBMS_CLOUD.CREATE_CREDENTIALプロシージャを実行し、ADBにクレデンシャル情報を登録します。
設定項目およびコマンド例は以下のとおりです。

・credential_name：任意（データロード時に使います）
・username：1)で認証トークンを作成した OCIユーザー名
・password：1)で事前に取得した認証トークン　　

```
BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'ADW_CRED',
    username => 'adw_credential',
    password => 'pppppppppppppppppp'
  );
END;
/
```

SQL Developerに上記コマンドを貼り付けて、左上の「文の実行」ボタン（緑色の▶）を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/8c87c689-0a26-2074-b1c5-5df3e249d628.png)

#### 2-5.バケットの作成

ロード元となるファイルをアップロードするための、オブジェクト・ストレージのバケット（（フォルダのようなもの）を作成しておきます。

オブジェクト・ストレージを操作する OCIユーザーでクラウドコンソールにサインインし、左上三本線メニューより「ストレージ＞オブジェクト・ストレージ」を選択します。

［バケットの作成］ボタンを押して、バケットの作成ダイアログを表示します。
バケット名を入力して、［作成］ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/933440e7-6f06-d215-a29c-a4b573e03dfe.png)


### 3.データロード

データロードを高速に行いたいため、事前にオブジェクト・ストレージにロード元となるファイルをアップロードしておき、SQL Developerからデータのインポート指示を出すという手順を記載します。

今回は特殊文字ということで、「$」で区切られた以下のようなorderデータをロードしてみたいと思います。

```
ID$顧客名$営業$製品名$単価$数量$金額$受注日
1$吉川電機 千葉店$岩井 正義$POCO Pad$75000$300$22500000$2015/5/2
64$吉川電機 神奈川店$森川 史男$Cloud Tablet$45000$2000$90000000$2015/5/2
27$吉川電機 東京店$森田 裕$Oracle Phone$50000$1000$50000000$2015/5/2
14$吉川電機 大阪店$福井 将$Oracle Watch$35000$500$17500000$2015/5/7
39$吉川電機 埼玉店$山岡 政利$Oracle Pad$60000$800$48000000$2015/5/7
65$吉川電機 広島店$中山 秀義$Cloud Tablet$45000$1500$67500000$2015/5/12
28$吉川電機 名古屋店$大泉 大輔$Oracle Phone$50000$1000$50000000$2015/5/12
52$吉川電機 北海道店$中山 秀義$EXA Phone$70000$800$56000000$2015/5/13
2$吉川電機 京都店$森岡 彩$POCO Pad$75000$500$37500000$2015/5/14
66$吉川電機 兵庫店$吉木 俊介$Cloud Tablet$45000$1000$45000000$2015/5/15
15$吉川電機 静岡店$柴岡 秀一$Oracle Watch$35000$2000$70000000$2015/5/17
40$吉川電機 石川店$加藤 優$Oracle Pad$60000$1500$90000000$2015/5/19
16$宮本カメラ 東京店$森田 裕$Oracle Watch$35000$1200$42000000$2015/5/20
29$宮本カメラ 神奈川店$山田 正一$Oracle Phone$50000$900$45000000$2015/5/26
　　　・
　　　・
　　　・
```

#### 3-1.オブジェクト・ストレージへのファイル・アップロード

オブジェクト・ストレージを操作する OCIユーザーでクラウドコンソールにサインインし、左上三本線メニューより「ストレージ＞オブジェクト・ストレージ」を選択します。

2-5.で作成したバケットを選択します。

［アップロード］ボタンを押し、オブジェクトのアップロード画面からロード用のファイルをアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/35a56a3c-4d69-6a4e-f817-0143409bb6c4.png)
<font color="red">※一度に複数のファイルをアップロードすることも可能です。</font>

ファイルがアップロードできたら、ファイル（オブジェクト）一覧から該当ファイルの右端にある3つの点をクリックし「オブジェクト詳細の表示」を選択します。

オブジェクトの詳細画面に表示される URLパス（URI）をテキストファイル等に保管しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/8efe531b-6585-33c5-981b-3d19d1e87b80.png)

#### 3-2.SQL Developerからのデータ・インポート

SQL Developerより、2-3.で作成したデータベース・ユーザーでADBにログインします。（ADMINユーザーではありません）

表を右クリックし「データのインポート」を選択します。
<font color="red">※すでに存在する表にデータを追加する場合は、該当の表で右クリック</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/9e637fd8-4922-f9cc-2a77-5c8917076bf4.png)

データ・プレビュー画面が表示されるので、以下を指定して［プレビュー］ボタンを押します。

・ソース：Oracle Cloud Storage
・ファイル：3-1.でオブジェクト・ストレージにアップロードしたファイルの URLパス（URI）
　※過去に入力したものは選択リストから選択可能
・資格証明：2-4.で指定したcredential_name
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/08326b9d-d81d-0c87-67f8-887f10172244.png)

画面下の「ファイルの内容」が表示されるので、オブジェクト・ストレージのファイルが読み込まれていることがわかります。

必要に応じてファイル形式を指定します。
今回、特に重要なのは、以下の2つです。

・フォーマット：delimited
・デリミタ：$（区切り文字を指定します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/4b638d1b-cf5a-0b22-d8eb-7e0aea33911a.png)

デリミタを指定することで、画面下の「ファイルの内容」が正しく表示されていることがわかります。

［次へ］ボタンでインポート方法画面に移り、必要な項目を指定します。

・インポート方法：クラウド・ロード
・表名：任意（ロードする表の名前）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/d0809315-5f0a-30b0-add4-f4080e0e984a.png)

［ロード・オプション］ボタンを押して、ロード・オプション画面を表示します。

必要に応じて設定を行いますが、<font color="red">データに日本語が入っている場合は「ファイルの文字セット句を生成」をチェックして、文字セットを指定します。</font>
（例えば、ロード元ファイルの文字コードがSJISの場合は「JA16SJISTILDE」などを指定します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/85917ccb-116b-1146-fc79-44a1579ca673.png)

ロード・オプション画面で［適用］ボタンを押し、［次へ］ボタンで列の定義画面に移ります。

列の定義画面では各列の属性を定義していきます。
※すでに存在する表へのデータロードの場合は列の定義は不要です。

・名前：任意の列名
・データ型
　　- 数値：NUMBER
　　- 文字：VARCHAR2…
・数値の場合
　　- サイズ：桁数
　　- スケール：小数点以下の桁数
・文字の場合
　　- サイズ：バイト数
　　　※ADBの文字コードはUTFとなるため（2021/5現在）、かな漢字は3バイト/文字で計算
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/f8fc5f17-21e6-fcc1-9379-9f5315093140.png)

すべての列の設定が終わったら［次へ］ボタンでテスト画面に移ります。

テストする行数を指定して［テスト］ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/76386dd3-01b6-ea72-154f-f323eeb3055c.png)

テストに成功すると、ステータスが「SUCCESS」になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/964e9b9f-dd88-3270-07f9-6d68e00d922c.png)

テストに成功しない場合は、この画面でテスト結果や不良ファイルの内容を確認できます。
前の画面に戻って設定内容を変更してから再度テストを実施します。

テストに成功した場合は［次へ］ボタンを押し、終了画面で［終了］ボタンを押すとデータロードが始まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/08b6cc41-dba8-7161-8685-37c61dc32756.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/cde22970-e23d-aef9-6325-ae7008e8b778.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/4dd88d16-2f49-eac0-bbd9-30f4b1cfade8.png)

ロードした表を確認するため、表を右クリックして「リフレッシュ」を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/80fc9347-e336-36e1-79f0-877db3071694.png)

表の一覧にロードで作成した表が表示されるのでクリックします。

指定したとおりに表が作成されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/a79fb658-bea9-fc46-f2d1-a3233406533c.png)

データタブをクリックすると、データの中身も確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/3aa63ea1-6172-e4d8-082c-654e4f75cfa6.png)

※データロードが正しく実行されてない場合は、実行後の画面および画面の最下部に記述されているログファイル表と不良ファイル表を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694576/9a67d69a-6109-148b-95ba-5d8b5d60fd28.png)