

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Aurora PostgreSQL の動的 SQL ステートメントの匿名ブロックを処理
<a name="handle-anonymous-blocks-in-dynamic-sql-statements-in-aurora-postgresql"></a>

*Amazon Web Services、Anuradha Chintha*

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

注: Amazon 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 データベース (DB) インスタンス](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Concepts.DBInstanceClass.html)」 
+ [Oracle DV インスタンスの Amazon Relational Database Service (Amazon RDS)の起動](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Oracle.html)
+ 「[PostgreSQL インタラクティブターミナル (psql)](https://www.postgresql.org/docs/current/app-psql.html)」 
+ 「[SQL \$1Plus](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/)」 の最新バージョンおよび必要なドライバー

## アーキテクチャ
<a name="handle-anonymous-blocks-in-dynamic-sql-statements-in-aurora-postgresql-architecture"></a>

**ソーステクノロジースタック**
+ オンプレミスの Oracle データベース 10.g 以降のバージョン

**ターゲットテクノロジースタック**
+ 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/ja_jp/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)」は、PostgreSQL デプロイのセットアップ、運用、スケーリングに役立つ、フルマネージド型のACID準拠のリレーショナルデータベースエンジンです。
+ 「[OracleのAmazon Relational Database Service (Amazon RDS)](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 データベース内のデータベースを開発および管理するために使用できる統合開発環境です。このパターンには 「[SQL \$1Plus](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>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Amazon RDS または Amazon EC2 で Oracle インスタンスを作成します。 | Amazon RDS で Oracle DB インスタンスを作成するには、Amazon RDS ドキュメントの 「[Oracle DB インスタンスの作成と Oracle DB インスタンスのデータベースへの接続](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.Oracle.html)」を参照してください。Amazon Elastic Compute Cloud (Amazon EC2) で Oracle DB インスタンスを作成するには、AWS 規範ガイダンス ドキュメントの 「[Oracle向けAmazon EC2](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-oracle-database/ec2-oracle.html)」を参照してください。 | DBA | 
| 移行のデータベーススキーマとオブジェクトを作成します。 | Amazon 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>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Amazon RDS に Aurora PostgreSQL インスタンスを作成します。 | Aurora PostgreSQL インスタンスを作成するには、Amazon RDS ドキュメントの「[ DB クラスターを作成して Aurora PostgreSQL DB クラスターのデータベースに接続](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_GettingStartedAurora.CreatingConnecting.AuroraPostgreSQL.html)」 を参照してください。 | DBA | 
| インバウンドとアウトバウンドのセキュリティグループを設定します。 | セキュリティグループを作成および設定するには、Aurora ドキュメントの「[セキュリティグループの設定によりVPCのDBクラスターへのアクセスを提供する](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>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| 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 スキーマ変換ツールユーザーガイドの「[AWS スキーマ変換ツールとは?](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Welcome.html)」を参照してください。 | DBA | 
| AWS SCT でデータベーススキーマを変換し、自動変換されたコードを SQL ファイルとして保存します。 | AWS SCT の変換されたファイルを保存するには、 AWS スキーマ変換ツールユーザーガイドの「[AWS SCT での変換済みスキーマの保存と適用](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Converting.html#CHAP_Converting.SaveAndApply)」を参照してください。 | DBA | 

### コードの移行
<a name="migrate-the-code"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| 手動変換用の 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 ; 
$$
```