Autonomous Databaseに自分自身のCPU数の設定値を変更させるPL/SQLプロシージャのサンプル（OCPU/ECPU両対応版）

# はじめに

Autonomous Databaseに自分自身のCPU数の設定値を変更させるPL/SQLプロシージャのサンプルを作成してみました。
こちらのプロシージャは、ECPUモデル、OCPUモデルのどちらのAutonomous Databaseでも動作します。

なお、こちらのプロシージャはあくまでサンプルですので、エラーハンドリング等は実装していません。
もしこちらのサンプルをもとに実装される場合は、エラーハンドリングの実装および充分な動作確認を実施してください。
また、こちらのサンプルを利用したことによるトラブルには一切責任は持ちませんし、こちらのサンプルの内容をもとにしたお問い合わせ等をご遠慮ください。

# 1. PL/SQLプロシージャのサンプル
プロシージャを実行するAutonomous DatabaseのCPU数の設定値を変更するPL/SQLプロシージャのサンプルです。

こちらのサンプルではリソース・プリンシパルを使用していますので、対象となるAutonomous Databaseを含む動的グループの作成および動的グループに対するAutonomous Databaseの管理を許可するポリシーの設定をあらかじめ行なっておきます。

```
CREATE OR REPLACE PROCEDURE change_cpu_count ( cpu_count IN NUMBER )
IS
    adb_ocid      VARCHAR2(200);
    adb_region    VARCHAR2(100);
    resp          DBMS_CLOUD_TYPES.RESP;
    body          JSON_OBJECT_T := JSON_OBJECT_T('{}');
    status_array  DBMS_CLOUD_TYPES.WAIT_FOR_STATES_T := DBMS_CLOUD_TYPES.WAIT_FOR_STATES_T('SUCCEEDED');
BEGIN
-- v$pdbsビューからAutonomous DatabaseのOCIDとリージョンを取得
    SELECT JSON_VALUE(cloud_identity, '$.REGION'), LOWER(json_value(cloud_identity, '$.DATABASE_OCID'))
        INTO adb_region, adb_ocid FROM v$pdbs;
-- リクエスト・ボディ内の変更後のCPU数（computeCount）に引数の値をセット
    body.put('computeCount', cpu_count);
-- DBMS_CLOUD.SEND_REQUESTファンクションでAPIをコール（ステイタスがSUCCEEDEDになるまで待ってから終了）
    resp := DBMS_CLOUD.SEND_REQUEST(
                  credential_name    => 'OCI$RESOURCE_PRINCIPAL',
                  uri                => 'https://database.'||adb_region||'.oraclecloud.com/20160918/autonomousDatabases/'||adb_ocid,
                  method             => DBMS_CLOUD.METHOD_PUT,
                  body               => UTL_RAW.CAST_TO_RAW(body.to_clob),
                  async_request_url  => 'https://iaas.'||adb_region||'.oraclecloud.com/20160918/workRequests',
                  wait_for_states    => status_array,
                  timeout            => 600
            );
END;
```

# 2. OCPUモデルのAutonomous Databaseでの動作確認
SQLclからOCPUモデルのAutonomous Databaseに接続します。
```
[opc@tools ~]$ sql admin/************@ADB_OCPU


SQLcl: Release 23.2 Production on Mon Feb 19 15:40:59 2024

Copyright (c) 1982, 2024, Oracle.  All rights reserved.

Last Successful login time: Mon Feb 19 2024 15:41:00 +09:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.22.0.1.0

SQL> 
```
PL/SQLプロシージャCHANGE_CPU_COUNTを作成します。
```
SQL> CREATE OR REPLACE PROCEDURE change_cpu_count ( cpu_count IN NUMBER )
  2  IS
  3      adb_ocid      VARCHAR2(200);
  4      adb_region    VARCHAR2(100);
  5      resp          DBMS_CLOUD_TYPES.RESP;
  6      body          JSON_OBJECT_T := JSON_OBJECT_T('{}');
  7      status_array  DBMS_CLOUD_TYPES.WAIT_FOR_STATES_T := DBMS_CLOUD_TYPES.WAIT_FOR_STATES_T('SUCCEEDED');
  8  BEGIN
  9  -- v$pdbsビューからAutonomous DatabaseのOCIDとリージョンを取得
 10      SELECT JSON_VALUE(cloud_identity, '$.REGION'), LOWER(json_value(cloud_identity, '$.DATABASE_OCID'))
 11          INTO adb_region, adb_ocid FROM v$pdbs;
 12  -- リクエスト・ボディ内の変更後のOCPU数/ECPU数（computeCount）に引数の値をセット
 13      body.put('computeCount', cpu_count);
 14  -- DBMS_CLOUD.SEND_REQUESTファンクションでAPIをコール（ステイタスがSUCCEEDEDになるまで待って終了）
 15      resp := DBMS_CLOUD.SEND_REQUEST(
 16                    credential_name    => 'OCI$RESOURCE_PRINCIPAL',
 17                    uri                => 'https://database.'||adb_region||'.oraclecloud.com/20160918/autonomousDatabases/'||adb_ocid,
 18                    method             => DBMS_CLOUD.METHOD_PUT,
 19                    body               => UTL_RAW.CAST_TO_RAW(body.to_clob),
 20                    async_request_url  => 'https://iaas.'||adb_region||'.oraclecloud.com/20160918/workRequests',
 21                    wait_for_states    => status_array,
 22                    timeout            => 600
 23              );
 24  END;
 25* /

Procedure CHANGE_CPU_COUNTがコンパイルされました

SQL>
```
プロシージャCHANGE_CPU_COUNTが作成できたので、実行してみます。

現在のOCPUの設定値をコンソールで確認します。
![スクリーンショット 2024-02-19 16.39.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/cb4345b3-438d-e291-0586-d3d94f6a9fb0.png)

現在のOCPUの設定値は2になっています。

プロシージャCHANGE_CPU_COUNTの引数として1を渡して実行し、OCPUの設定値を1に変更します。
```
SQL> exec change_cpu_count(1);
```
プロシージャCHANGE_CPU_COUNTは設定値の変更終了を待って終了するので、しばらくはこのままの表示になります。

コンソールを確認します。
![スクリーンショット 2024-02-19 16.42.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/15455d78-5403-96c6-7f9e-22186e337d2d.png)

ライフサイクルの状態が「スケーリング進行中」になっています。

しばらく待つと、プロシージャが完了します。
```
SQL> exec change_cpu_count(1);


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

SQL>
```
コンソールでADBのライフサイクルの状態（ステータス）とOCPUの設定値を確認します。
![スクリーンショット 2024-02-19 16.46.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/2848ecaa-092a-bcfe-2b50-3a66e3c72d46.png)

ADBのライフサイクルの状態が「使用可能」になり、OCPUの設定値が1に変更されていることが確認できました。


CHANGE_CPU_COUNTプロシージャの引数として1を渡して実行し、OCPUの設定値を1に変更します。
```
SQL> exec change_cpu_count(2);
```

# 3. ECPUモデルのAutonomous Databaseでの動作確認

SQLclからECPUモデルのAutonomous Databaseに接続します。

```
[opc@tools ~]$ sql admin/************@ADB_ECPU


SQLcl: Release 23.2 Production on Mon Feb 19 15:31:32 2024

Copyright (c) 1982, 2024, Oracle.  All rights reserved.

Last Successful login time: Mon Feb 19 2024 15:31:34 +09:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.22.0.1.0

SQL>
```
PL/SQLプロシージャCHANGE_CPU_COUNTを作成します。
```
SQL> CREATE OR REPLACE PROCEDURE change_cpu_count ( cpu_count IN NUMBER )
  2  IS
  3      adb_ocid      VARCHAR2(200);
  4      adb_region    VARCHAR2(100);
  5      resp          DBMS_CLOUD_TYPES.RESP;
  6      body          JSON_OBJECT_T := JSON_OBJECT_T('{}');
  7      status_array  DBMS_CLOUD_TYPES.WAIT_FOR_STATES_T := DBMS_CLOUD_TYPES.WAIT_FOR_STATES_T('SUCCEEDED');
  8  BEGIN
  9  -- v$pdbsビューからAutonomous DatabaseのOCIDとリージョンを取得
 10      SELECT JSON_VALUE(cloud_identity, '$.REGION'), LOWER(json_value(cloud_identity, '$.DATABASE_OCID'))
 11          INTO adb_region, adb_ocid FROM v$pdbs;
 12  -- リクエスト・ボディ内の変更後のOCPU数/ECPU数（computeCount）に引数の値をセット
 13      body.put('computeCount', cpu_count);
 14  -- DBMS_CLOUD.SEND_REQUESTファンクションでAPIをコール（ステイタスがSUCCEEDEDになるまで待って終了）
 15      resp := DBMS_CLOUD.SEND_REQUEST(
 16                    credential_name    => 'OCI$RESOURCE_PRINCIPAL',
 17                    uri                => 'https://database.'||adb_region||'.oraclecloud.com/20160918/autonomousDatabases/'||adb_ocid,
 18                    method             => DBMS_CLOUD.METHOD_PUT,
 19                    body               => UTL_RAW.CAST_TO_RAW(body.to_clob),
 20                    async_request_url  => 'https://iaas.'||adb_region||'.oraclecloud.com/20160918/workRequests',
 21                    wait_for_states    => status_array,
 22                    timeout            => 600
 23              );
 24  END;
 25* /

Procedure CHANGE_CPU_COUNTがコンパイルされました

SQL>
```
プロシージャCHANGE_CPU_COUNTが作成できたので、実行してみます。

現在のECPUの設定値をコンソールで確認します。
![スクリーンショット 2024-02-19 16.59.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/98be791c-f247-9144-e02f-1cce8642632c.png)

現在のECPUの設定値は4になっています。

プロシージャCHANGE_CPU_COUNTの引数として2を渡して実行し、ECPUの設定値を2に変更します。
```
SQL> exec change_cpu_count(2);
```
プロシージャCHANGE_CPU_COUNTは設定値の変更終了を待って終了するので、しばらくはこのままの表示になります。

コンソールを確認します。
![スクリーンショット 2024-02-19 17.01.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/efb66340-780a-5362-e38f-318c4fdff3a4.png)

ライフサイクルの状態が「スケーリング進行中」になっています。

しばらく待つと、プロシージャが完了します。
```
SQL> exec change_cpu_count(2);

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

SQL> 
```

コンソールでADBのライフサイクルの状態（ステータス）とOCPUの設定値を確認します。
![スクリーンショット 2024-02-19 17.03.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/032df07a-8ea6-e868-b7dc-76c373e1be4d.png)

ADBのライフサイクルの状態が「使用可能」になり、ECPUの設定値が2に変更されていることが確認できました。

# まとめ
Autonomous Database自身のCPU数の設定値を変更させるPL/SQLプロシージャを作成でき、ECPUモデル、OCPUモデルのどちらのAutonomous Databaseでも動作することが確認できました。