

# Amazon RDS for Db2 の外部ストアドプロシージャ
<a name="db2-external-stored-procedures"></a>

外部ルーチンを作成し、外部ストアドプロシージャとして Amazon RDS for Db2 データベースに登録できます。現在、RDS for Db2 は外部ストアドプロシージャ用の Java ベースのルーチンのみをサポートしています。

## Java ベースの外部ストアドプロシージャ
<a name="db2-external-stored-procedures-java"></a>

Java ベースの外部ストアドプロシージャは、外部ストアドプロシージャとして RDS for Db2 データベースに登録する外部 Java ルーチンです。

**Topics**
+ [Java ベースの外部ストアドプロシージャの制限](#db2-external-stored-procedures-java-limitations)
+ [Java ベースの外部ストアドプロシージャの設定](#db2-external-stored-procedures-java-configuring)

### Java ベースの外部ストアドプロシージャの制限
<a name="db2-external-stored-procedures-java-limitations"></a>

外部ルーチンを開発する前に、次の制限を考慮してください。

外部ルーチンを作成するには、Db2 が提供する Java 開発キット (JDK) を必ず使用してください。詳細については、「[Java software support for Db2 database products](https://www.ibm.com/docs/en/db2/11.5?topic=servers-java-software-support-db2-database-products)」を参照してください。

Java プログラムは `/tmp` ディレクトリにのみファイルを作成でき、Amazon RDS はこれらのファイルに対する実行権限や Set User ID (SUID) 権限の有効化をサポートしていません。また、Java プログラムはソケットシステム呼び出し、または次のシステム呼び出しを使用することはできません。
+ \$1sysctl
+ acct
+ afs\$1syscall
+ bpf
+ capset
+ chown
+ chroot
+ create\$1module
+ delete\$1module
+ fanotify\$1init
+ fanotify\$1mark
+ finit\$1module
+ fsconfig
+ fsopen
+ fspick
+ get\$1kernel\$1syms
+ getpmsg
+ init\$1module
+ mount
+ move\$1mount
+ nfsservctl
+ open\$1by\$1handle\$1at
+ open\$1tree
+ pivot\$1root
+ putpmsg
+ query\$1module
+ quotactl
+ reboot
+ security
+ setdomainname
+ setfsuid
+ sethostname
+ sysfs
+ tuxcall
+ umount2
+ uselib
+ ustat
+ vhangup
+ vserver

Db2 の外部ルーチンに関するその他の制限については、「IBM Db2 Documentation」の「[Restrictions on external routines](https://www.ibm.com/docs/en/db2/11.5?topic=routines-restrictions-external)」を参照してください。

### Java ベースの外部ストアドプロシージャの設定
<a name="db2-external-stored-procedures-java-configuring"></a>

外部ストアドプロシージャを設定するには、外部ルーチンで.jar ファイルを作成して RDS for Db2 データベースにインストールし、外部ストアドプロシージャとして登録します。

**Topics**
+ [ステップ 1: 外部ストアドプロシージャの有効化](#db2-external-stored-procedures-java-enable)
+ [ステップ 2: 外部ルーチンで.jar ファイルをインストールする](#db2-external-stored-procedures-java-install-jar)
+ [ステップ 3: 外部ストアドプロシージャを登録する](#db2-external-stored-procedures-java-register)
+ [ステップ 4: 外部ストアドプロシージャを検証する](#db2-external-stored-procedures-java-validate)

#### ステップ 1: 外部ストアドプロシージャの有効化
<a name="db2-external-stored-procedures-java-enable"></a>

外部ストアドプロシージャを有効にするには、DB インスタンスに関連付けられているカスタムパラメータグループで、`db2_alternate_authz_behaviour` パラメータを次のいずれかの値に設定します。
+ `EXTERNAL_ROUTINE_DBADM` — `DBADM` 権限を持つユーザー、グループ、またはロールに暗黙的に `CREATE_EXTERNAL_ROUTINE` 権限を付与します。
+ `EXTERNAL_ROUTINE_DBAUTH` — `DBADM` 権限を持つユーザーが任意のユーザー、グループ、またはロールに `CREATE_EXTERNAL_ROUTINE` 権限を付与することを許可します。この場合、`DBADM` 権限を持つユーザーも含め、ユーザー、グループ、またはロールに暗黙的にこの権限が付与されることはありません。

この設定の詳細については、IBM Db2 ドキュメントの「[GRANT (database authorities) statement](https://www.ibm.com/docs/en/db2/11.5?topic=statements-grant-database-authorities)」を参照してください。

AWS マネジメントコンソール、AWS CLI、または Amazon RDS API を使用して、カスタムパラメータグループを作成および変更することができます。

##### コンソール
<a name="db2-external-stored-procedures-java-enable-console"></a>

**カスタムパラメータグループで db2\$1alternate\$1authz\$1behaviour パラメータを設定するには**

1. DB インスタンスが使用しているものとは異なるカスタム DB パラメータグループを使用する場合は、新しい DB パラメータグループを作成します。Bring-Your-Own-License (BYOL) モデルを使用している場合は、新しいカスタムパラメータグループに IBM ID が含まれていることを確認してください。これらの ID の詳細については、「[Db2 の Bring-Your-Own-License (BYOL) の IBM ID](db2-licensing.md#db2-prereqs-ibm-info)」を参照してください。DB パラメータグループの作成の詳細については、「[Amazon RDS での DB パラメータグループの作成](USER_WorkingWithParamGroups.Creating.md)」を参照してください。

1. カスタムパラメータグループで `db2_alternate_authz_behaviour` パラメータに値を設定します。パラメータグループの変更の詳細については、「[Amazon RDS の DB パラメータグループのパラメータの変更](USER_WorkingWithParamGroups.Modifying.md)」を参照してください。

##### AWS CLI
<a name="db2-external-stored-procedures-java-enable-cli"></a>

**カスタムパラメータグループで db2\$1alternate\$1authz\$1behaviour パラメータを設定するには**

1. DB インスタンスが使用しているものとは異なるカスタム DB パラメータグループを使用する場合は、[https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-parameter-group.html](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-parameter-group.html) コマンドを実行して、カスタムパラメータグループを作成します。Bring-Your-Own-License (BYOL) モデルを使用している場合は、新しいカスタムパラメータグループに IBM ID が含まれていることを確認してください。これらの ID の詳細については、「[Db2 の Bring-Your-Own-License (BYOL) の IBM ID](db2-licensing.md#db2-prereqs-ibm-info)」を参照してください。

   次の必須パラメータを含めます。
   + `--db-parameter-group-name` - 作成するパラメータグループの名前。
   + `--db-parameter-group-family` - Db2 エンジンエディションとメジャーバージョン。有効な値は、`db2-se-11.5` および `db2-ae-11.5` です。
   + `--description` - このパラメータグループの説明。

   DB パラメータグループの作成の詳細については、「[Amazon RDS での DB パラメータグループの作成](USER_WorkingWithParamGroups.Creating.md)」を参照してください。

   次の例は、`db2-se-11.5` パラメータグループファミリーの `MY_EXT_SP_PARAM_GROUP` カスタムパラメータグループを作成する方法を示しています。

   Linux、macOS、Unix の場合:

   ```
   aws rds create-db-parameter-group \
   --region us-east-1 \
   --db-parameter-group-name MY_EXT_SP_PARAM_GROUP \
   --db-parameter-group-family db2-se-11.5 \ 
   --description "test db2 external routines"
   ```

   Windows の場合:

   ```
   aws rds create-db-parameter-group ^
   --region us-east-1 ^
   --db-parameter-group-name MY_EXT_SP_PARAM_GROUP ^
   --db-parameter-group-family db2-se-11.5 ^ 
   --description "test db2 external routines"
   ```

1. [https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-parameter-group.html](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-parameter-group.html) コマンドを実行して、カスタムパラメータグループの `db2_alternate_authz_behaviour` パラメータを変更します。

   次の必須パラメータを含めます。
   + `--db-parameter-group-name` – 作成したパラメータグループの名前。
   + `--parameters` – パラメータ名、値、およびパラメータ更新用のアプリケーションメソッドの配列。

   パラメータグループの変更の詳細については、「[Amazon RDS の DB パラメータグループのパラメータの変更](USER_WorkingWithParamGroups.Modifying.md)」を参照してください。

   次の例は、`db2_alternate_authz_behaviour` の値を `EXTERNAL_ROUTINE_DBADM` に設定して、`MY_EXT_SP_PARAM_GROUP` パラメータグループを変更する方法を示しています。

   Linux、macOS、Unix の場合:

   ```
   aws rds modify-db-parameter-group \
       --db-parameter-group-name MY_EXT_SP_PARAM_GROUP \
       --parameters "ParameterName='db2_alternate_authz_behaviour',ParameterValue='EXTERNAL_ROUTINE_DBADM',ApplyMethod=immediate"
   ```

   Windows の場合:

   ```
   aws rds modify-db-parameter-group ^
       --db-parameter-group-name MY_EXT_SP_PARAM_GROUP ^
       --parameters "ParameterName='db2_alternate_authz_behaviour',ParameterValue='EXTERNAL_ROUTINE_DBADM',ApplyMethod=immediate"
   ```

##### RDS API
<a name="db2-external-stored-procedures-java-enable-api"></a>

**カスタムパラメータグループで db2\$1alternate\$1authz\$1behaviour パラメータを設定するには**

1. DB インスタンスが使用しているものとは異なるカスタム DB パラメータグループを使用する場合は、Amazon RDS API [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBParameterGroup.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBParameterGroup.html) オペレーションを使用して、新しい DB パラメータグループを作成します。Bring-Your-Own-License (BYOL) モデルを使用している場合は、新しいカスタムパラメータグループに IBM Db2 ID が含まれていることを確認してください。これらの ID の詳細については、「[Db2 の Bring-Your-Own-License (BYOL) の IBM ID](db2-licensing.md#db2-prereqs-ibm-info)」を参照してください。

   以下の必須パラメータを含めます。
   + `DBParameterGroupName`
   + `DBParameterGroupFamily`
   + `Description`

   DB パラメータグループの作成の詳細については、「[Amazon RDS での DB パラメータグループの作成](USER_WorkingWithParamGroups.Creating.md)」を参照してください。

1. RDS API [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBParameterGroup.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBParameterGroup.html) オペレーションを使用して、作成したカスタムパラメータグループの `db2_alternate_authz_behaviour` パラメータを変更します。

   以下の必須パラメータを含めます。
   + `DBParameterGroupName`
   + `Parameters`

   パラメータグループの変更の詳細については、「[Amazon RDS の DB パラメータグループのパラメータの変更](USER_WorkingWithParamGroups.Modifying.md)」を参照してください。

#### ステップ 2: 外部ルーチンで.jar ファイルをインストールする
<a name="db2-external-stored-procedures-java-install-jar"></a>

Java ルーチンを作成したら、.jar ファイルを作成して `db2 "call sqlj.install_jar('file:file_path',jar_ID)"` を実行し、RDS for Db2 データベースにインストールします。

次の例は、Java ルーチンを作成して、RDS for Db2 データベースにインストールする方法を示しています。この例には、プロセスのテストに使用できる簡単なルーチンのサンプルコードが含まれています。この例では、次を前提としています。
+ Java コードは Db2 がインストールされたサーバー上でコンパイルされていること。IBM が提供する JDK を使用してコンパイルしない場合、原因不明のエラーが発生する可能性があるため、このベストプラクティスに従ってください。
+ サーバーの RDS for Db2 データベースがローカルでカタログ化されていること。

次のコード例を使用してこのプロセスを試す場合は、コード例をコピーして、`MYJAVASP.java` という名前のファイルに保存します。

```
import java.sql.*;
public class MYJAVASP
{
public static void my_JAVASP (String inparam) throws SQLException, Exception
{
try
{
// Obtain the calling context's connection details.
Connection myConn = DriverManager.getConnection("jdbc:default:connection");
String myQuery = "INSERT INTO TEST.TEST_TABLE VALUES (?, CURRENT DATE)";
PreparedStatement myStmt = myConn.prepareStatement(myQuery);
myStmt.setString(1, inparam);
myStmt.executeUpdate();
}
catch (SQLException sql_ex)
{
throw sql_ex;
}
catch (Exception ex)
{
throw ex;
}
}
```

次のコマンドは Java ルーチンをコンパイルします。

```
~/sqllib/java/jdk64/bin/javac MYJAVASP.java
```

次のコマンドは.jar ファイルを作成します。

```
~/sqllib/java/jdk64/bin/jar cvf MYJAVASP.jar MYJAVASP.class
```

次のコマンドは、`MY_DB2_DATABASE` という名前のデータベースに接続して、.jar ファイルをインストールします。

```
db2 "connect to MY_DB2_DATABASE user master_username using master_password" 

db2 "call sqlj.install_jar('file:/tmp/MYJAVASP.jar','MYJAVASP')"
db2 "call sqlj.refresh_classes()"
```

#### ステップ 3: 外部ストアドプロシージャを登録する
<a name="db2-external-stored-procedures-java-register"></a>

RDS for Db2 データベースに.jar ファイルをインストールしたら、`db2 CREATE PROCEDURE` コマンドまたは `db2 REPLACE PROCEDURE` コマンドを実行してストアドプロシージャとして登録します。

次の例は、データベースに接続し、前のステップで作成した Java ルーチンをストアドプロシージャとして登録する方法を示しています。

```
db2 "connect to MY_DB2_DATABASE user master_username using master_password"

create procedure TESTSP.MYJAVASP (in input char(6))
specific myjavasp
dynamic result sets 0
deterministic
language java
parameter style java
no dbinfo
fenced
threadsafe
modifies sql data
program type sub
external name 'MYJAVASP!my_JAVASP';
```

#### ステップ 4: 外部ストアドプロシージャを検証する
<a name="db2-external-stored-procedures-java-validate"></a>

次の手順を使用して、前のステップで登録したサンプル外部ストアドプロシージャをテストします。

**外部ストアドプロシージャを検証するには**

1. 次の例の `TEST.TEST_TABLE` ようなテーブルを作成します。

   ```
   db2 "create table TEST.TEST_TABLE(C1 char(6), C2 date)"
   ```

1. 新しい外部ストアドプロシージャを呼び出します。呼び出しは `0` のステータスを返します。

   ```
   db2 "call TESTSP.MYJAVASP('test')"
   Return Status = 0
   ```

1. ステップ 1 で作成したテーブルをクエリして、ストアドプロシージャ呼び出しの結果を確認します。

   ```
   db2 "SELECT * from TEST.TEST_TABLE"
   ```

   クエリは次の例のような出力を生成します。

   ```
   C1     C2
   ------ ----------
   test   02/05/2024
   ```