[OCI]指定したAutonomous Databaseのステータス（Lifecycle State）を返すPL/SQLファンクションを作成してみた

# はじめに

SQLでAutonomous Databaseのステータス（AVAILABLE、STOPPED、STARTING、UPDATING等）が確認できると何かと便利なので、指定したAutonomous Databaseのステータスを返すストアド・ファンクションを作成してみました。

Autonomous DatabaseがあるリージョンとAutonomous DatabaseのOCIDを引数として渡すと、指定されたAutonoumos Databaseのステータス（Lifecycle State）を返すファンクションget_adb_stateを作成します。
ここではAPIアクセスの認証にAutonomous Databaseのリソース・プリンシパルを使用しています。

```sql:get_adb_state Function
CREATE OR REPLACE FUNCTION get_adb_state ( adb_region IN VARCHAR2, adb_ocid IN VARCHAR2)
  RETURN VARCHAR2
  IS
    request_uri    VARCHAR2(300);
    resp           DBMS_CLOUD_TYPES.resp;
  
  BEGIN
-- 指定したAutonomous Databaseの情報を取得するAPIをコールするためのURIの生成
    request_uri := 'https://database.'||adb_region||'.oraclecloud.com/20160918/autonomousDatabases/'||adb_ocid;
-- Autonomous Databaseの情報を取得するAPIをコール
    resp := DBMS_CLOUD.SEND_REQUEST(
                credential_name => 'OCI$RESOURCE_PRINCIPAL',
                uri => request_uri,
                method => DBMS_CLOUD.METHOD_GET
            );
-- 取得したAutonomous Databaseの情報内のlifecycleStateの値を戻す
    RETURN json_value(DBMS_CLOUD.GET_RESPONSE_TEXT(resp), '$.lifecycleState');
  END;
/
```
SQL*Plusから作成してみます。
```
SQL> CREATE OR REPLACE FUNCTION get_adb_state ( adb_region IN VARCHAR2, adb_ocid IN VARCHAR2)
  2    RETURN VARCHAR2
  3    IS
  4      request_uri    VARCHAR2(300);
  5      resp           DBMS_CLOUD_TYPES.resp;
  6    BEGIN
  7      request_uri := 'https://database.'||adb_region||'.oraclecloud.com/20160918/autonomousDatabases/'||adb_ocid;
  8      resp := DBMS_CLOUD.SEND_REQUEST(
  9                  credential_name => 'OCI$RESOURCE_PRINCIPAL',
 10                  uri => request_uri,
 11                  method => DBMS_CLOUD.METHOD_GET
 12              );
 13      RETURN json_value(DBMS_CLOUD.GET_RESPONSE_TEXT(resp), '$.lifecycleState');
 14    END;
 15  /

ファンクションが作成されました。

SQL>
```
問題なく作成できましたので、早速実行してみます。
get_adb_stateファンクションにAutonomous DatabaseがあるリージョンとAutonomous DatabaseのOCIDを渡して実行してみました。
ここではap-osaka-1（=大阪リージョン）と大阪リージョンにあるAutonomous DatabaseのOCIDを指定しています。

```
SQL> select get_adb_state('ap-osaka-1','ocid1.autonomousdatabase.oc1.ap-osaka-1.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') adb_state from dual;

ADB_STATE
--------------------------------------------------------------------------------
AVAILABLE

SQL>
```
ステータスが「AVAILABLE」であることがわかりました。

コンソールでAutonomous Databaseのステータスを確認してみます。
![スクリーンショット 2022-12-07 13.44.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/637b9eee-e836-e3f8-31c8-f135be3c9e92.png)
「使用可能」であることが確認できました。

こちらのAutonomous Databaseを停止して、get_adb_stateファンクションの結果が変化するかを確認してみます。
![スクリーンショット 2022-12-07 13.46.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/50ae91ab-c363-b268-f4d5-632a037cf040.png)

コンソールで「停止中」となっている状態では、get_adb_stateファンクションの結果が「STOPPING」になりました。
```
SQL> select get_adb_state('ap-osaka-1','ocid1.autonomousdatabase.oc1.ap-osaka-1.anvwsljrssl65iqauegw5yxqxprruyhckxfs5atzsitj5xjgrz4e4q4b5pia') adb_state from dual;

ADB_STATE
--------------------------------------------------------------------------------
STOPPING

SQL>
```
停止済みになるのを待ちます。
![スクリーンショット 2022-12-07 13.48.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/de6eb87c-bf66-c4bf-5ccd-e3c297510c90.png)

コンソールで「停止済」となっている状態では、get_adb_stateファンクションの結果が「STOPPED」になりました。

```
SQL> select get_adb_state('ap-osaka-1','ocid1.autonomousdatabase.oc1.ap-osaka-1.anvwsljrssl65iqauegw5yxqxprruyhckxfs5atzsitj5xjgrz4e4q4b5pia') adb_state from dual;

ADB_STATE
--------------------------------------------------------------------------------
STOPPED

SQL>
```
こちらのAutonomous Databaseを起動します。
![スクリーンショット 2022-12-07 14.05.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/f984ea56-db35-b254-4491-3240eeaf9ca0.png)

コンソールで「起動中」となっている状態では、get_adb_stateファンクションの結果が「STARTING」になりました。
```
SQL> select get_adb_state('ap-osaka-1','ocid1.autonomousdatabase.oc1.ap-osaka-1.anvwsljrssl65iqauegw5yxqxprruyhckxfs5atzsitj5xjgrz4e4q4b5pia') adb_state from dual;

ADB_STATE
--------------------------------------------------------------------------------
STARTING

SQL>
```
Autonomous Databaseが使用可能になるのを待ちます。
![スクリーンショット 2022-12-07 14.08.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/4ed70e30-e39f-cee6-7b55-e46e6f0f54a4.png)

get_adb_stateファンクションの結果が「STARTING」に戻りました。
```
SQL> select get_adb_state('ap-osaka-1','ocid1.autonomousdatabase.oc1.ap-osaka-1.anvwsljrssl65iqauegw5yxqxprruyhckxfs5atzsitj5xjgrz4e4q4b5pia') adb_state from dual;

ADB_STATE
--------------------------------------------------------------------------------
AVAILABLE

SQL>
```
こちらのAutonomous Databaseはリフレッシュ可能クローンなので、リフレッシュを実行してみます。
リフレッシュ中はコンソールでは「更新中」と表示されます。
![スクリーンショット 2022-12-07 14.12.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/7ccbdaa1-6bfd-fd63-a02c-e64ffd107a48.png)
コンソールで「更新中」となっている状態では、get_adb_stateファンクションの結果が「UPDATING」になりました。
```
SQL> select get_adb_state('ap-osaka-1','ocid1.autonomousdatabase.oc1.ap-osaka-1.anvwsljrssl65iqauegw5yxqxprruyhckxfs5atzsitj5xjgrz4e4q4b5pia') adb_state from dual;

ADB_STATE
--------------------------------------------------------------------------------
UPDATING

SQL> 

```
# まとめ
指定したAutonomous Databaseの状態（Lifecycle State）を返すストアド・ファンクションを作成できました。
めでたし、めでたし。

# 参考資料
・[API Reference and Endpoints：Database Service API](https://docs.oracle.com/en-us/iaas/api/#/en/database/20160918/)
・[API Reference and Endpoints：GetAutonomousDatabase](https://docs.oracle.com/en-us/iaas/api/#/en/database/20160918/AutonomousDatabase/GetAutonomousDatabase)
・[DBMS_CLOUD.SEND_REQUEST](https://docs.oracle.com/cd//E83857_01/paas/autonomous-database/adbsa/dbms-cloud-subprograms.html#GUID-B063870D-6C1F-4F33-B354-885B73C81D37)
・[DBMS_CLOUD.GET_RESPONSE_TEXT](https://docs.oracle.com/cd//E83857_01/paas/autonomous-database/adbsa/dbms-cloud-subprograms.html#GUID-A7412604-3484-4522-903E-7547097E6B93)