

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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)。如需詳細資訊，請參閱 [Db2 資料庫產品的 Java 軟體支援](https://www.ibm.com/docs/en/db2/11.5?topic=servers-java-software-support-db2-database-products)。

您的 Java 程式只能在 `/tmp` 目錄中建立檔案，Amazon RDS 並不支援啟用這些檔案的可執行檔或設定使用者 ID (SUID) 許可。您的 Java 程式也無法使用通訊端系統呼叫或下列系統呼叫：
+ \_sysctl
+ acct
+ afs\_syscall
+ bpf
+ capset
+ chown
+ chroot
+ create\_module
+ delete\_module
+ fanotify\_init
+ fanotify\_mark
+ finit\_module
+ fsconfig
+ fsopen
+ fspick
+ get\_kernel\_syms
+ getpmsg
+ init\_module
+ mount
+ move\_mount
+ nfsservctl
+ open\_by\_handle\_at
+ open\_tree
+ pivot\_root
+ putpmsg
+ query\_module
+ quotactl
+ reboot
+ security
+ setdomainname
+ setfsuid
+ sethostname
+ sysfs
+ tuxcall
+ umount2
+ uselib
+ ustat
+ vhangup
+ vserver

如需 Db2 外部常式的其他限制，請參閱 IBM Db2 文件中的[外部常式的限制](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>

若要啟用外部預存程序，請在與資料庫執行個體相關聯的自訂參數群組中，將 `db2_alternate_authz_behaviour` 參數設定為下列其中一個值：
+ `EXTERNAL_ROUTINE_DBADM` – 對具有 `DBADM` 授權的任何使用者、群組或角色隱含授予 `CREATE_EXTERNAL_ROUTINE` 許可。
+ `EXTERNAL_ROUTINE_DBAUTH` – 允許具有 `DBADM` 授權將 `CREATE_EXTERNAL_ROUTINE` 許可授予任何使用者、群組或角色的使用者。在此情況下，沒有任何使用者、群組或角色會隱含授予此許可，甚至不會隱含授予具有 `DBADM` 授權的使用者。

如需此設定的詳細資訊，請參閱 IBM Db2 文件中的 [GRANT (資料庫授權單位) 陳述式](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\_alternate\_authz\_behaviour 參數**

1. 如果您想要使用與資料庫執行個體正在使用的自訂資料庫參數群組不同的自訂資料庫參數群組，請建立新的資料庫參數群組。如果您使用自帶授權 (BYOL) 模型，請確定新的自訂參數群組包含 IBM ID。如需這些 ID 的相關資訊，請參閱 [Db2 的自帶授權 (BYOL) IBM ID](db2-licensing.md#db2-prereqs-ibm-info)。如需建立資料庫參數群組的詳細資訊，請參閱[在 Amazon RDS 中建立資料庫參數群組](USER_WorkingWithParamGroups.Creating.md)。

1. 在自訂參數群組中設定 `db2_alternate_authz_behaviour` 參數的值。如需修改參數群組的相關詳細資訊，請參閱 [修改 Amazon RDS 中的資料庫參數群組中的參數](USER_WorkingWithParamGroups.Modifying.md)。

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

**在自訂參數群組中設定 db2\_alternate\_authz\_behaviour 參數**

1. 如果您想要使用不同於資料庫執行個體在使用的自訂資料庫參數群組，請執行 [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) 命令來建立自訂參數群組。如果您使用自帶授權 (BYOL) 模型，請確定新的自訂參數群組包含 IBM ID。如需這些 ID 的相關資訊，請參閱 [Db2 的自帶授權 (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` – 此參數群組的描述。

   如需建立資料庫參數群組的詳細資訊，請參閱[在 Amazon RDS 中建立資料庫參數群組](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 中的資料庫參數群組中的參數](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\_alternate\_authz\_behaviour 參數**

1. 如果您想要使用與資料庫執行個體正在使用的自訂資料庫參數群組不同的自訂資料庫參數群組，請使用 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) 作業來建立新的資料庫參數群組。如果您使用自帶授權 (BYOL) 模型，請確定新的自訂參數群組包含 IBM Db2 ID。如需這些 ID 的相關資訊，請參閱 [Db2 的自帶授權 (BYOL) IBM ID](db2-licensing.md#db2-prereqs-ibm-info)。

   包含下列必要參數：
   + `DBParameterGroupName`
   + `DBParameterGroupFamily`
   + `Description`

   如需建立資料庫參數群組的詳細資訊，請參閱[在 Amazon RDS 中建立資料庫參數群組](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 中的資料庫參數群組中的參數](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
   ```