[OCI]Autonomous Databaseが指定したステータス（Lifecycle State）になるのを待って終了するPL/SQLプロシージャを作成してみた

# はじめに
とある目的のために、指定したAutonomous Databaseが指定した状態（Lifecycle State）になるのを待って終了するPL/SQLプロシージャを作成しました。

ここでは、以下の記事で作成しているAutonomous DatabaseがあるリージョンとAutonomous DatabaseのOCIDを引数として渡すと、指定されたAutonoumos Databaseのステータス（Lifecycle State）を返すファンクションget_adb_stateが作成済みの前提でプロシージャを作成しています。

https://qiita.com/500InternalServerError/items/40b5ba220730b4a956b7

# 1. PL/SQLプロシージャの作成
Autonomous Databaseがあるリージョン、Autonomous DatabaseのOCIDと、プロシージャの終了条件となるAutonomous Databaseの状態（Lifecycle State）を指定して実行すると、30秒おきにAutonomous Databaseの状態を確認し、Autonomous Databaseが指定した状態になったら終了するストアド・プロシージャwait_adb_stateを作成します。

```sql:wait_adb_state 
CREATE OR REPLACE PROCEDURE wait_adb_state (adb_region IN VARCHAR2, adb_ocid IN VARCHAR2, adb_state IN VARCHAR2)
  IS
  BEGIN
    WHILE (get_adb_state(adb_region, adb_ocid) != UPPER(adb_state))
      LOOP
        DBMS_SESSION.SLEEP(30);
	    DBMS_OUTPUT.PUT_LINE('Waiting for '||UPPER(adb_state)||' state.'||CHR(10));
	    DBMS_OUTPUT.PUT_LINE('Current status is '||get_adb_state(adb_region, adb_ocid)||CHR(10));
      END LOOP;
  END;
/
```
SQL*Plusから作成してみます。
```
SQL> CREATE OR REPLACE PROCEDURE wait_adb_state (
  2    adb_region IN VARCHAR2,
  3    adb_ocid   IN VARCHAR2,
  4    adb_state  IN VARCHAR2
  5  )
  6    IS
  7    BEGIN
  8      WHILE (get_adb_state(adb_region, adb_ocid) != UPPER(adb_state))
  9        LOOP
 10          DBMS_SESSION.SLEEP(30);
 11          DBMS_OUTPUT.PUT_LINE('Waiting for '||UPPER(adb_state)||'state.'||CHR(10));
 12          DBMS_OUTPUT.PUT_LINE('Current status is '||get_adb_state(adb_region, adb_ocid)||CHR(10));
 13        END LOOP;
 14    END;
 15  /

プロシージャが作成されました。

SQL>
```

大阪リージョンにあるAutonomous Databaseが「AVAILABLE」（使用可能）の状態になるのを待つようにパラメータを渡してプロシージャを実行します。
```
SQL> set time on
15:50:34 SQL> exec wait_adb_state('ap-osaka-1','ocid1.autonomousdatabase.oc1.ap-osaka-1.anvwsljrssl65iqauegw5yxqxprruyhckxfs5atzsitj5xjgrz4e4q4b5pia','AVAILABLE')
```
この時点ではプロシージャは実行状態のままのため、表示は変わりません。

コンソールから対象のAutonomous Databaseを起動します。
![スクリーンショット 2022-12-07 15.31.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/6a5312bc-a4f2-c08a-0cdb-836a2584d2bc.png)
Autonomous Databaseの状態が「起動中」に変わります。
![スクリーンショット 2022-12-07 15.32.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/685594c5-c18e-ab32-98ee-79aa5153d36b.png)
しばらく待つと「使用可能」になります。
![スクリーンショット 2022-12-07 15.33.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/6a397ffd-1c29-53a3-3d41-0330a823acce.png)

SQL*Plusを確認すると、プロシージャが完了しています。
```
15:50:34 SQL> exec wait_adb_state('ap-osaka-1','ocid1.autonomousdatabase.oc1.ap-osaka-1.anvwsljrssl65iqauegw5yxqxprruyhckxfs5atzsitj5xjgrz4e4q4b5pia','available')
Waiting for AVAILABLE　state.

Current status is STARTING


Waiting for AVAILABLE　state.

Current status is STARTING


Waiting for AVAILABLE　state.

Current status is AVAILABLE



PL/SQLプロシージャが正常に完了しました。

15:52:08 SQL>
```
同様に大阪リージョンにあるAutonomous Databaseが「AVAILABLE」（使用可能）の状態になるのを待つようにパラメータを渡してプロシージャを実行します。
```
15:53:06 SQL> exec wait_adb_state('ap-osaka-1','ocid1.autonomousdatabase.oc1.ap-osaka-1.anvwsljrssl65iqauegw5yxqxprruyhckxfs5atzsitj5xjgrz4e4q4b5pia','STOPPED')
```
対象のAutonomous Databaseを停止します。
![スクリーンショット 2022-12-07 15.36.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/29c204d4-cac4-0b1f-2009-66d182877f05.png)
Autonomous Databaseの状態が「停止中」に変わります。
![スクリーンショット 2022-12-07 15.36.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/0a279a7c-2575-2295-701e-b5edfaafdedd.png)
しばらく待つと「停止済」になります。
![スクリーンショット 2022-12-07 16.15.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/06cfcd4d-e508-aa75-bedf-9d2a5c59730b.png)

SQL*Plusを確認すると、プロシージャが完了しています。
```
15:53:06 SQL> exec wait_adb_state('ap-osaka-1','ocid1.autonomousdatabase.oc1.ap-osaka-1.anvwsljrssl65iqauegw5yxqxprruyhckxfs5atzsitj5xjgrz4e4q4b5pia','STOPPED')
Waiting for STOPPED　state.

Current status is STOPPING

Waiting for STOPPED　state.

Current status is STOPPING


Waiting for STOPPED　state.

Current status is STOPPING


Waiting for STOPPED　state.

Current status is STOPPED



PL/SQLプロシージャが正常に完了しました。

15:54:43 SQL>
```

# まとめ
Autonomous Databaseが指定したステータス（Lifecycle State）になるのを待って終了するPL/SQLプロシージャが作成できました。
めでたし、めでたし

# 参考資料
・[DBMS_SESSION.SLEEP](https://docs.oracle.com/cd/F19136_01/arpls/DBMS_SESSION.html#GUID-27CCC2F7-6564-41D2-8C42-CFFBF25A69B5)