[OCI] Autonomous DatabaseでOracle Cloud Infrastructure SDK for PL/SQL a.k.a. PL/SQL SDKを使ってみた

# はじめに
Oracle Cloud Infrastructure SDK for PL/SQL（PL/SQL SDK）がリリースされ、共有インフラストラクチャのAutonomous Databaseでは既に利用できるようになっています。

[Oracle Cloud Infrastructure Documentation Developer Guide](https://docs.cloud.oracle.com/en-us/iaas/Content/API/SDKDocs/plsqlsdk.htm)

PL/SQL SDKを使用して、オブジェクト・ストレージ・バケット内のオブジェクトの一覧を取得し、オブジェクト名をDB内のテーブルに保存するPL/SQLプログラムを作成してみました。

# 手順

1.キーペアの作成
2.テナント、ユーザのOCIDの確認
3.APIキーの作成
4.SDKを利用するためのクレデンシャル（資格証明）の作成
5.PL/SQL SDKを使用したプログラムの作成

# 1.キーペアの作成

こちらの情報を参考にして、PEMフォーマットのRSAキー・ペアを作成します。
https://docs.cloud.oracle.com/en-us/iaas/Content/API/Concepts/apisigningkey.htm

# 2.テナント、ユーザのOCIDの確認

コンソールでテナントのOCID、ユーザのOCIDを確認してメモしておきます。

# 3. APIキーの作成

*「アイデンティティ」　→ 「ユーザ」　→ 「ユーザの詳細」*

リソース欄の「APIキー」をクリックします。

「公開キーの追加」ボタンをクリックします。
![スクリーンショット 2020-10-29 9.31.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/6b8d9a9a-78f6-7e37-9833-e1e4db0f5142.png)
「公開キーの貼付け」を選択して、作成したキーペアの公開鍵の内容をコピー＆ペーストし、「追加」をクリックします。
![スクリーンショット 2020-10-29 9.25.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/a4372f6f-f8bc-3932-866e-8b20337b2a66.png)

公開キーの追加後に表示されるフィンガープリントをメモしておきます。

# 4.SDKを利用するためのクレデンシャル（資格証明）の作成

今回はMY_SDK_CREDという名前のSDKアクセス用のクレデンシャルを作成します。

private_keyには、作成した秘密鍵の内容からヘッダ（-----BEGIN RSA PRIVATE KEY-----）、フッタ（-----END RSA PRIVATE KEY-----）を除いた部分を記述します。

```
SET DEFINE OFF
BEGIN
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'MY_SDK_CRED',
    user_ocid => 'ユーザのOCID',
    tenancy_ocid => 'テナントのOCID',
    private_key => 'MIIE......',
    fingerprint => '公開キーのフィンガープリント'
  );
END;
/
```

今回はAutonomous Databaseに標準搭載されているSQL Developer Webから実行しました。

# 5.PL/SQL SDKを使用したPL/SQLプロシジャの作成

今回は以下のようなPL/SQLプロシジャを作成しました。

・リージョン、ネームスペース、バケット名を受け取って、該当ストレージ・バケット内にあるオブジェクトの一覧を取得し、取得したオブジェクトの名前をobject_list表に挿入

object_list表は以下のSQLで作成します。

```
CREATE TABLE object_list (
object_name VARCHAR2(100)
);
```

実際に作成したPL/SQLプロシジャは以下のようになります。

```
CREATE OR REPLACE PROCEDURE get_obj_list(namespace IN VARCHAR2, bucket IN VARCHAR2, region_id IN VARCHAR2)
IS

  object_summary dbms_cloud_oci_obs_object_storage_object_summary_tbl;
  response_body  dbms_cloud_oci_obs_object_storage_list_objects_t;
  response       dbms_cloud_oci_obs_object_storage_list_objects_response_t;
  json_obj       json_object_t;
  l_keys         json_key_list;

BEGIN

  -- 指定されたバケット内のオブジェクトリストの取得
  response := dbms_cloud_oci_obs_object_storage.list_objects(
                namespace_name => namespace,
                bucket_name => bucket,
                credential_name => 'MY_SDK_CRED',
                region => region_id);
 
  response_body := response.response_body;

  object_summary := response_body.objects;

  -- 取得したオブジェクト名をobject_list表にINSERT
  FOR i IN object_summary.first..object_summary.last LOOP
     INSERT INTO object_list VALUES (object_summary(i).name);
  END LOOP;
  COMMIT;

END;
/
```

# 6. PL/SQLプロシジャの動作確認
PL/SQLプロシージャが作成できたので、動作を確認してみます。

まず、object_list表を空にします。

```
TRUNCATE TABLE object_list;
```
![スクリーンショット 2020-10-29 12.01.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/ced5bd97-a0e6-6df2-2623-7f994454a356.png)

次に、実際に表にデータがないか確認します。

```
SELECT * FROM object_list;
```
![スクリーンショット 2020-10-29 12.01.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/5cacd408-69ad-e3fa-388b-34094b2cf997.png)

先ほど作成したPL/SQLプロシジャを実行します。

こちらでは、
ネームスペース：nrhnlrqdttaw
バケット名：MyBucket
リージョン：ap-tokyo-1
として実行します。

なお、こちらのバケットには5つのオブジェクトが格納されています。

![スクリーンショット 2020-10-29 12.10.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/a3666d30-3903-43ab-7573-3141ccc75dc9.png)


```
EXECUTE get_obj_list('nrhnlrqdttaw','MyBucket','ap-tokyo-1');
```
![スクリーンショット 2020-10-29 12.02.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/4cca831d-9db1-0b9a-caa1-606d3c3d23d5.png)

object_list表の中身を確認します。

```
SELECT * FROM object_list;
```
![スクリーンショット 2020-10-29 12.03.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/83889d0c-b1a8-2455-f6b4-95e816fbd3fc.png)
このように、PL/SQL SDKを使用してバケット内のオブジェクト名の一覧を取得し、Autonomous Database内の表に格納することができました。

PL/SQL SDKはオブジェクト・ストレージだけでなくさまざまなOCIのサービスに対応していますので、いろいろ活用できそうです。
今後もいろいろ試してみたいと思います。