Aurora PostgreSQL の動的 SQL ステートメントの匿名ブロックを処理 - AWS 規範ガイダンス

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

Aurora PostgreSQL の動的 SQL ステートメントの匿名ブロックを処理

作成者: anuradha chintha (AWS)

環境:PoC またはパイロット

ソース: データベースリレーショナル

ターゲット: PostgreSQL

Rタイプ: リアーキテクト

ワークロード: Oracle、オープンソース

テクノロジー: データベース、移行

AWS サービス: Amazon Aurora、Amazon RDS

[概要]

このパターンでは、動的 SQL ステートメントで匿名ブロックを処理する場合に発生するエラーを回避する方法を示しています。AWS Schema Conversion Tool を使用して、Oracle データベースを Aurora PostgreSQL 互換エディションデータベースに変換するとエラーメッセージが表示されます。このエラーを回避するには、OUT バインド変数の値を知っている必要がありますが、SQL ステートメントの実行後まで OUT のバインド変数の値を知ることはできません。。このエラーは、AWS Schema Conversion Tool (AWS SCT) が動的 SQL ステートメント内部のロジックを理解していないことが原因です。AWS SCT は PL/SQL コード (つまり、関数、プロシージャ、パッケージ) の動的 SQL ステートメントを変換できません。

前提条件と制限

前提条件 

アーキテクチャ

ソーステクノロジースタック

  • オンプレミスの 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 のバインド変数の使用に関するアーキテクチャ図

この図表は、次のワークフローを示しています:

  1. Aurora PostgreSQL をターゲットデータベースとして使用して、ソースデータベースの AWS SCT レポートを生成します。

  2. 動的 SQL コードブロック (AWS SCT がエラーを発生させたブロック) 内の、匿名ブロックを特定します。

  3. コードブロックを手動で変換し、ターゲットデータベースにコードをデプロイします。

ツール

AWS サービス

  • Amazon Aurora PostgreSQL 互換エディション」は、PostgreSQL デプロイのセットアップ、運用、スケーリングに役立つ、フルマネージド型のACID準拠のリレーショナルデータベースエンジンです。

  • OracleのAmazon Relational Database Service (Amazon RDS)」 によって、AWS クラウドで Oracleリレーショナルデータベースをセットアップ、運用、スケーリングができます。

  • AWS Schema Conversion Tool (AWS SCT)」 によって、ソースデータベーススキーマと大部分のデータベースコードオブジェクトを、ターゲットデータベースと互換性のある形式に自動的に変換することで、異種データベースの移行を予測可能にします。

その他のツール

  • pgAdmin」を使用して、データベースサーバーに接続して操作できます。

  • Oracle SQL Developer」 は、Oracle データベース内のデータベースを開発および管理するために使用できる統合開発環境です。このパターンには 「SQL *Plus」または Oracle SQL Developer のいずれも使用できます。

エピック

タスク説明必要なスキル

Amazon RDS または Amazon EC2 で Oracle インスタンスを作成します。

Amazon RDS で Oracle DB インスタンスを作成するには、Amazon RDS ドキュメントの 「Oracle DB インスタンスの作成と Oracle DB インスタンスのデータベースへの接続」を参照してください。

Amazon Elastic Compute Cloud (Amazon EC2) で Oracle DB インスタンスを作成するには、AWS 規範ガイダンス ドキュメントの 「Oracle向けAmazon EC2」を参照してください。

DBA

移行のデータベーススキーマとオブジェクトを作成します。

Amazon Cloud Directory を使用して、データベーススキーマを作成することができます。詳細については、クラウドディスカバリドキュメントの 「スキーマの作成」 を参照してください。

DBA

インバウンドとアウトバウンドのセキュリティグループを設定します。

セキュリティグループを作成して設定するには、Amazon RDS ドキュメントの「セキュリティグループによるアクセス制御」を参照してください。

DBA

データベースが実行されていることを確認します。

データベースのステータスを確認するには、Amazon RDS ドキュメントの「Amazon RDS イベントの表示」 を参照してください。

DBA
タスク説明必要なスキル

Amazon RDS に Aurora PostgreSQL インスタンスを作成します。

Aurora PostgreSQL インスタンスを作成するには、Amazon RDS ドキュメントの「 DB クラスターを作成して Aurora PostgreSQL DB クラスターのデータベースに接続」 を参照してください。

DBA

インバウンドとアウトバウンドのセキュリティグループを設定します。

セキュリティグループを作成および設定するには、Aurora ドキュメントの「セキュリティグループの設定によりVPCのDBクラスターへのアクセスを提供する」 を参照してください。

DBA

Aurora PostgreSQL データベースが実行されていることを確認します。

データベースのステータスを確認するには、Aurora ドキュメントの「Amazon RDS イベントの表示」を参照してください。

DBA
タスク説明必要なスキル

AWS SCTをソースデータベースに接続する。

AWS SCT をソースデータベースに接続するには、AWS SCT ドキュメントの「ソースとして PostgreSQL に接続する」を参照してください。

DBA

AWS SCT をターゲットデータベースに接続します。

AWS SCT をターゲットデータベースに接続するには、 AWS スキーマ変換ツールユーザーガイドの「AWS スキーマ変換ツールとは?」を参照してください。

DBA

AWS SCT でデータベーススキーマを変換し、自動変換されたコードを SQL ファイルとして保存します。

AWS SCT の変換されたファイルを保存するには、 AWS スキーマ変換ツールユーザーガイドの「AWS SCT での変換済みスキーマの保存と適用」を参照してください。

DBA
タスク説明必要なスキル

手動変換用の SQL ファイルを取得します。

AWS SCT で変換されたファイルで、手動変換が必要な SQL ファイルを引き出します。

DBA

スクリプトを更新します。

SQL ファイルを手動で更新します。

DBA

関連リソース

追加情報

次のサンプルコードは、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 ; $$