[Autonomous DB]Autonomous Database でのハイブリッドパーティション表

ADW/ATP(Autonomous DB)でOracle19cのPreviewが開始されました。
このPreview版で、Oracle Database19c 新機能 ハイブリッド・パーティション表を作成してみます。
Object Storageにアップロードしたファイルを外部表（パーティション）とします。

### 参考情報
- [Oracle Database19c 新機能 ハイブリッド・パーティション表](https://qiita.com/kenwatan/items/34acc346e6b9fde20569)
- [ADW/ATP(Autonomous DB)でObject StorageにアップロードされたCSVファイル(gzip圧縮済)を外部表(EXTERNAL TABLE)として直接参照する。(OCI, Oracle Cloud Infrastructure)](https://qiita.com/ora_gonsuke777/items/7f790554a84c1aa16a71)

# ADW/ATP(Autonomous DB)でOracle19c版の作成
今回はWebコンソールを使ってAutonomous Databaseを作成します。
![image01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/c7a5c7ac-8379-dc48-d06f-e98f71672e3b.jpeg)
作成ウィザードの中盤に「新しいデータベース・プレビュー・バージョン19cが使用可能」の選択が可能になっています。
![image02.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/be1720dd-7ed2-4cb2-6f75-522fc6731865.jpeg)
(Preview機関の取り扱いには留意ください）

# 事前認証済リクエストのURLの利用の例
## 事前認証済リクエストのURLの取得
1.アップロードしたファイル（オブジェクト）の右側のメニューから「事前認証済リクエストの作成」を選択
![image03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/99e4a182-e054-cbcc-1dc9-b2204e2dd43f.jpeg)

2.「事前認証済リクエストの作成」をクリック（すべてデフォルトのままでOK）
![image04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/06bb0af1-cb0d-6aa3-4ee8-8d785719e432.jpeg)

3.表示される「事前認証済リクエストのURL」をメモ(右側のボタンでクリックボードにコピーが可能)
![image05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/14b22343-cda7-61ab-113a-9da49473a644.jpeg)

## スキーマユーザでDDL文の実行
```
BEGIN
DBMS_CLOUD.CREATE_HYBRID_PART_TABLE(
      table_name =>'hybrid_partition_table',  
      format => json_object('delimiter' value ',', 'recorddelimiter' value 'newline', 'characterset' value 'us7ascii', 'skipheaders' value '1', 'dateformat' value 'RR-MM-DD'),  
      column_list => ' prod_id       NUMBER,
      cust_id       NUMBER      ,
      time_id       DATE        ,
      quantity_sold NUMBER(10,2),
      amount_sold   NUMBER(10,2)',
      partitioning_clause => 'partition by range (time_id)
    (
     PARTITION sales_2018 VALUES LESS THAN (TO_DATE(''01-01-2019'',''dd-mm-yyyy'')) EXTERNAL LOCATION (''https://objectstorage.ap-tokyo-1.oraclecloud.com/p/YwSPf/o/sales2018_data.csv''),
     PARTITION sales_2019 VALUES LESS THAN (TO_DATE(''01-01-2020'',''dd-mm-yyyy''))'
     );
END;
/
```
EXTERNAL LOCATION に「事前認証済リクエストのURL」のURLを指定
DBMS_CLOUDパッケージ・フォーマット・オプション
[https://docs.oracle.com/cd/E83857_01/paas/autonomous-data-warehouse-cloud/user/format-options.html#GUID-08C44CDA-7C81-481A-BA0A-F7346473B703] (https://docs.oracle.com/cd/E83857_01/paas/autonomous-data-warehouse-cloud/user/format-options.html#GUID-08C44CDA-7C81-481A-BA0A-F7346473B703)

## スキーマユーザでDDL文の実行（圧縮ファイル指定）
```
BEGIN
DBMS_CLOUD.CREATE_HYBRID_PART_TABLE(
      table_name =>'hybrid_partition_table',  
      format => json_object('delimiter' value ',', 'recorddelimiter' value 'newline', 'characterset' value 'us7ascii', 'skipheaders' value '1', 'dateformat' value 'RR-MM-DD','compression' value 'auto'),  
      column_list => ' prod_id       NUMBER,
    cust_id       NUMBER      ,
    time_id       DATE        ,
    quantity_sold NUMBER(10,2),
    amount_sold   NUMBER(10,2)',
      partitioning_clause => 'partition by range (time_id)
    (
     PARTITION sales_2018 VALUES LESS THAN (TO_DATE(''01-01-2019'',''dd-mm-yyyy'')) EXTERNAL LOCATION (''https://objectstorage.ap-seoul-1.oraclecloud.com/p/YwSPf/o/sales2018_data.csv.gz''),
     PARTITION sales_2019 VALUES LESS THAN (TO_DATE(''01-01-2020'',''dd-mm-yyyy''))'
     );
   END;
/
```
# CREDENTIALの利用の例
## 認証トークンの生成
[こちらの記事](https://gonsuke777.hatenablog.com/entry/2019/01/22/163547#4-OCI%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8GROUP%E8%A8%AD%E5%AE%9AAuth-Token%E7%94%9F%E6%88%90)の「4. OCIユーザーの作成とGROUP設定、Auth Token生成」を参照ください。
## CREDENTIALを作成
```
begin
  DBMS_CLOUD.create_credential (
    credential_name => 'OBJ_STORE_CRED',	-- 任意の文字列
    username => ‘<your username>’,		-- 認証トークンを生成したOCIユーザー名
    password => ‘<your Auth Token>‘	-- 生成した認証トークン
  ) ;
end;
/

```
## Oracle Cloud Infrastructure Object Storage URI の取得
Object Storage のメニューから アップロードされた外部表に使用するCSVファイルの「オブジェクト詳細の表示」を選択し、「URLパス(URI)」をコピー
![image06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/88d0d1a6-2fe1-2984-8213-f435446d5a31.jpeg)

## スキーマユーザでCredential を使用したDDL文の実行
```
BEGIN
DBMS_CLOUD.CREATE_HYBRID_PART_TABLE(
      table_name =>'hybrid_partition_table',  
      credential_name =>'OBJ_STORE_CRED',
      format => json_object('delimiter' value ',', 'recorddelimiter' value 'newline', 'characterset' value 'us7ascii', 'skipheaders' value '1', 'dateformat' value 'RR-MM-DD'),  
      column_list => ' prod_id       NUMBER,
      cust_id       NUMBER      ,
      time_id       DATE        ,
      quantity_sold NUMBER(10,2),
      amount_sold   NUMBER(10,2)',
      partitioning_clause => 'partition by range (time_id)
    (
     PARTITION sales_2018 VALUES LESS THAN (TO_DATE(''01-01-2019'',''dd-mm-yyyy'')) EXTERNAL LOCATION (''https://objectstorage.ap-tokyo-1.oraclecloud.com/p/_ZakYhMb5-1e_yiKxUCzgqyPT-nFL4kyVLWNsELD-Ps/n/nrzbmmnby7ly/b/bucket/o/*.csv''),
     PARTITION sales_2019 VALUES LESS THAN (TO_DATE(''01-01-2020'',''dd-mm-yyyy''))'
     );
END;
/
```
作成した「CREDENTIAL」のcredential_name を指定しEXTERNAL LOCATIONにObject Storage の「URLパス(URI)」を指定（ EXTERNAL LOCATION には ワイルドカードが指定可能 ）

-- 
Autonomous Databaseでもハイブリッド・パーティション表が利用できることを確認しました。
Object Storageのファイルを利用することで利便性を維持しながら、効率的な運用ができそうです。