

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

# 在 Aurora PostgreSQL 中處理動態 SQL 陳述式中的匿名區塊
<a name="handle-anonymous-blocks-in-dynamic-sql-statements-in-aurora-postgresql"></a>

*anuradha chintha，Amazon Web Services*

## 總結
<a name="handle-anonymous-blocks-in-dynamic-sql-statements-in-aurora-postgresql-summary"></a>

注意：Amazon Cloud Directory 不再開放給新客戶。如需 Cloud Directory 的替代方案，請探索 [Amazon DynamoDB](https://aws.amazon.com/dynamodb/) 和 [Amazon Neptune](https://aws.amazon.com/neptune/)。如果您需要協助為您的使用案例選擇正確的替代方案，或有其他問題，請聯絡 [AWS 支援](https://aws.amazon.com/support/)。

此模式說明如何避免在動態 SQL 陳述式中處理匿名區塊時遇到的錯誤。當您使用 AWS Schema Conversion Tool 將 Oracle 資料庫轉換為 Aurora PostgreSQL 相容版本資料庫時，會收到錯誤訊息。為了避免錯誤，您必須知道`OUT`綁定變數的值，但在執行 SQL 陳述式之前，您無法知道`OUT`綁定變數的值。AWS Schema Conversion Tool (AWS SCT) 無法了解動態 SQL 陳述式中的邏輯所產生的錯誤。AWS SCT 無法轉換 PL/SQL 程式碼中的動態 SQL 陳述式 （即函數、程序和套件）。

## 先決條件和限制
<a name="handle-anonymous-blocks-in-dynamic-sql-statements-in-aurora-postgresql-prereqs"></a>

**先決條件**
+ 作用中 AWS 帳戶
+ [Aurora PostgreSQL 資料庫 （資料庫） 執行個體](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Concepts.DBInstanceClass.html)
+ [Oracle 資料庫執行個體的 Amazon Relational Database Service (Amazon RDS)](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Oracle.html)
+ [PostgreSQLinteractive 終端機 (psql)](https://www.postgresql.org/docs/current/app-psql.html)
+ [SQL \*Plus](https://docs.oracle.com/cd/B14117_01/server.101/b12170/qstart.htm)
+ `AWS_ORACLE_EXT` 目標資料庫中的結構描述 ([AWS SCT 延伸套件](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_ExtensionPack.html)的一部分）
+ 最新版 [AWS Schema Conversion Tool (AWS SCT)](https://aws.amazon.com/dms/schema-conversion-tool/) 及其必要的驅動程式

## Architecture
<a name="handle-anonymous-blocks-in-dynamic-sql-statements-in-aurora-postgresql-architecture"></a>

**來源技術堆疊**
+ 內部部署 Oracle 資料庫 10g 及更新版本

**目標技術堆疊**
+ Amazon Aurora PostgreSQL
+ Amazon RDS for PostgreSQL
+ AWS Schema Conversion Tool (AWS SCT)

**遷移架構**

下圖顯示如何使用 AWS SCT 和 Oracle `OUT`繫結變數來掃描應用程式程式碼以取得內嵌 SQL 陳述式，並將程式碼轉換為 Aurora 資料庫可以使用的相容格式。

![使用 AWS SCT 和 Oracle OUT 繫結變數的架構圖](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/ada89410-b866-4d39-af9c-021be6cc6ae5/images/7c004981-2ed0-4b67-989f-54d8691712ca.png)


該圖顯示以下工作流程：

1. 使用 Aurora PostgreSQL 做為目標資料庫，為來源資料庫產生 AWS SCT 報告。

1. 識別動態 SQL 程式碼區塊中的匿名區塊 (AWS SCT 為此引發錯誤）。

1. 手動轉換程式碼區塊，並在目標資料庫上部署程式碼。

## 工具
<a name="handle-anonymous-blocks-in-dynamic-sql-statements-in-aurora-postgresql-tools"></a>

**AWS 服務**
+ [Amazon Aurora PostgreSQL 相容版本](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html)是完全受管的 ACID 相容關聯式資料庫引擎，可協助您設定、操作和擴展 PostgreSQL 部署。
+ [Amazon Relational Database Service (Amazon RDS) for Oracle](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html) 可協助您在 AWS 雲端中設定、操作和擴展 Oracle 關聯式資料庫。
+ [AWS Schema Conversion Tool (AWS SCT)](https://aws.amazon.com/dms/schema-conversion-tool/) 可將來源資料庫結構描述和大部分資料庫程式碼物件自動轉換為與目標資料庫相容的格式，協助您預測異質資料庫遷移。

**其他工具**
+ [pgAdmin](https://www.pgadmin.org/) 可讓您連線至資料庫伺服器並與之互動。
+ [Oracle SQL Developer](https://www.oracle.com/database/sqldeveloper/) 是一種整合的開發環境，可用來開發和管理 Oracle Database 中的資料庫。您可以針對此模式使用 [SQL \*Plus](https://docs.oracle.com/cd/B19306_01/server.102/b14357/qstart.htm) 或 Oracle SQL Developer。

## 史詩
<a name="handle-anonymous-blocks-in-dynamic-sql-statements-in-aurora-postgresql-epics"></a>

### 設定 Oracle 來源資料庫
<a name="configure-the-oracle-source-database"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 在 Amazon RDS 或 Amazon EC2 上建立 Oracle 執行個體。 | 若要在 Amazon RDS 上建立 Oracle 資料庫執行個體，請參閱《Amazon RDS 文件》中的[建立 Oracle 資料庫執行個體並連線至 Oracle 資料庫執行個體上的](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.Oracle.html)資料庫。<br />若要在 Amazon Elastic Compute Cloud (Amazon EC2) 上建立 Oracle 資料庫執行個體，請參閱 AWS 規範指引文件中的 [Amazon EC2 for Oracle](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-oracle-database/ec2-oracle.html)。 | DBA | 
| 建立資料庫結構描述和物件以進行遷移。 | 您可以使用 Amazon Cloud Directory 來建立資料庫結構描述。如需詳細資訊，請參閱 Cloud Directory 文件中的[建立結構描述](https://docs.aws.amazon.com/clouddirectory/latest/developerguide/getting_started_create_schema.html)。 | DBA | 
| 設定傳入和傳出安全群組。 | 若要建立和設定安全群組，請參閱 Amazon RDS 文件中的[使用安全群組控制存取](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.RDSSecurityGroups.html)。 | DBA | 
| 確認資料庫正在執行。 | 若要檢查資料庫的狀態，請參閱 [Amazon RDS 文件中的檢視 Amazon RDS 事件](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ListEvents.html)。 | DBA | 

### 設定目標 Aurora PostgreSQL 資料庫
<a name="configure-the-target-aurora-postgresql-database"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 在 Amazon RDS 中建立 Aurora PostgreSQL 執行個體。 | 若要建立 Aurora PostgreSQL 執行個體，請參閱 Amazon RDS 文件中的[建立資料庫叢集並連線至 Aurora PostgreSQL 資料庫叢集](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_GettingStartedAurora.CreatingConnecting.AuroraPostgreSQL.html)上的資料庫。 | DBA | 
| 設定傳入和傳出安全群組。 | 若要建立和設定安全群組，請參閱 Aurora 文件[中的透過建立安全群組來提供 VPC 中資料庫叢集的存取權](https://docs.amazonaws.cn/en_us/AmazonRDS/latest/AuroraUserGuide/CHAP_SettingUp_Aurora.html#CHAP_SettingUp_Aurora.SecurityGroup)。 | DBA | 
| 確認 Aurora PostgreSQL 資料庫正在執行。 | 若要檢查資料庫的狀態，請參閱 Aurora 文件中的[檢視 Amazon RDS 事件](https://docs.amazonaws.cn/en_us/AmazonRDS/latest/AuroraUserGuide/USER_ListEvents.html)。 | DBA | 

### 設定 AWS SCT
<a name="set-up-aws-sct"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將 AWS SCT 連線至來源資料庫。 | 若要將 AWS SCT 連線至來源資料庫，請參閱 AWS SCT 文件中的[連線至 PostgreSQL 做為來源](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Source.PostgreSQL.html#CHAP_Source.PostgreSQL.Connecting)。 | DBA | 
| 將 AWS SCT 連線至目標資料庫。 | 若要將 AWS SCT 連線至目標資料庫，請參閱[《AWS Schema Conversion Tool 使用者指南》中的什麼是 AWS Schema Conversion Tool？](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Welcome.html)。 Schema Conversion Tool  | DBA | 
| 在 AWS SCT 中轉換資料庫結構描述，並將自動轉換的程式碼儲存為 SQL 檔案。 | 若要儲存 AWS SCT 轉換的檔案，請參閱[《AWS 結構描述轉換工具使用者指南》中的在 AWS SCT 中儲存和套用轉換](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Converting.html#CHAP_Converting.SaveAndApply)Schema Conversion Tool。 | DBA | 

### 遷移程式碼
<a name="migrate-the-code"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 取得 SQL 檔案以進行手動轉換。 | 在 AWS SCT 轉換檔案中，提取需要手動轉換的 SQL 檔案。 | DBA | 
| 更新指令碼。 | 手動更新 SQL 檔案。 | DBA | 

## 相關資源
<a name="handle-anonymous-blocks-in-dynamic-sql-statements-in-aurora-postgresql-resources"></a>
+ [Amazon RDS](https://aws.amazon.com/rds/)
+ [Amazon Aurora 功能](https://aws.amazon.com/rds/aurora/postgresql-features/)

## 其他資訊
<a name="handle-anonymous-blocks-in-dynamic-sql-statements-in-aurora-postgresql-additional"></a>

下列範例程式碼示範如何設定 Oracle 來源資料庫：

```
CREATE or replace PROCEDURE calc_stats_new1 (
  a NUMBER,
  b NUMBER,
  result out NUMBER)
IS
BEGIN
result:=a+b;
END;
/
```

```
set serveroutput on ;
 
DECLARE
  a NUMBER := 4;
  b NUMBER := 7;
  plsql_block VARCHAR2(100);
  output number;
BEGIN
  plsql_block := 'BEGIN calc_stats_new1(:a, :b,:output); END;';
  EXECUTE IMMEDIATE plsql_block USING a, b,out output;  
  DBMS_OUTPUT.PUT_LINE('output:'||output);
 
END;
```

下列範例程式碼示範如何設定目標 Aurora PostgreSQL 資料庫：

```
 w integer,
 x integer)
RETURNS integer
AS
$BODY$
DECLARE
begin
return w + x ;
end;
$BODY$
LANGUAGE  plpgsql;
 
 
CREATE OR REPLACE FUNCTION test_pg.init()
RETURNS void
AS
$BODY$
BEGIN
if aws_oracle_ext.is_package_initialized
      ('test_pg' ) then
      return;
    end if;
    perform aws_oracle_ext.set_package_initialized
      ('test_pg' );
 
PERFORM aws_oracle_ext.set_package_variable('test_pg', 'v_output', NULL::INTEGER);
PERFORM aws_oracle_ext.set_package_variable('test_pg', 'v_status', NULL::text);
END;
$BODY$
LANGUAGE  plpgsql;
 

DO $$ 
declare
v_sql text;
v_output_loc int; 
a integer :=1;
b integer :=2;
BEGIN 
perform  test_pg.init();
--raise notice 'v_sql %',v_sql;
execute 'do $a$ declare v_output_l int; begin select * from test_pg.calc_stats_new1('||a||','||b||') into v_output_l;
PERFORM aws_oracle_ext.set_package_variable(''test_pg'', ''v_output'', v_output_l) ; end; $a$'  ; 
v_output_loc := aws_oracle_ext.get_package_variable('test_pg', 'v_output');
raise notice 'v_output_loc %',v_output_loc; 
END ; 
$$
```