

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

# Oracle SERIALLY\_REUSABLE Pragma パッケージを Amazon Aurora または Amazon RDS for PostgreSQL に移行する
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql"></a>

*Amazon Web Services、Vinay Paladi*

## 概要
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-summary"></a>

このパターンは、元の機能 AWSを維持しながら、SERIALLY\_REUSABLE Pragma を使用する Oracle パッケージを Amazon Aurora PostgreSQL 互換エディションまたは Amazon RDS for PostgreSQL に移行するstep-by-stepのアプローチを提供します。

PRAGMA SERIALLY\_REUSABLE は、サーバーへの 1 回の呼び出し (PL/SQL 匿名ブロックやデータベースリンクを介したストアドプロシージャ呼び出しなど) の間のみパッケージ状態が必要であることを示します。この呼び出しの後、パッケージ変数のストレージを再利用できるため、メモリ消費量を削減できます。

PostgreSQL は、SERIALLY\_REUSABLE Pragma の概念をネイティブにサポートしていません。同等の機能を実現するために、このパターンではラッパー関数アプローチと AWS Database Migration Service (AWS DMS) [スキーマ変換 (AWS DMS SC) ](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_SchemaConversion.html)機能を組み合わせてパッケージ構造を移行します。提供されているサンプルスクリプトは、PostgreSQL reset-on-each-call動作を維持する方法を示しています。

詳細については、Oracle ドキュメントの「[SERIALLY\_REUSABLE Pragma](https://docs.oracle.com/en/database/oracle/oracle-database/19/lnpls/SERIALLY_REUSABLE-pragma.html)」を参照してください。

## 前提条件と制限事項
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-prereqs"></a>
+ アクティブな AWS アカウント
+  AWS DMS Schema Conversion サービスへのアクセス
+ Amazon Aurora PostgreSQL 互換エディションデータベースまたは Amazon RDS for PostgreSQL データベース
+ Oracle データベースバージョン 10g 以降

## アーキテクチャ
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-architecture"></a>

**ソーステクノロジースタック**
+ オンプレミスの Oracle データベース

**ターゲットテクノロジースタック**
+ 「[Aurora PostgreSQL 互換](https://aws.amazon.com/rds/aurora/details/postgresql-details/)」または Amazon RDS for PostgreSQL
+ AWS DMS スキーマ変換

**移行アーキテクチャ**

![Oracle SERIALLY_REUSABLE Pragma パッケージを Amazon Aurora または Amazon RDS for PostgreSQL に移行する](https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/fe3c45d2-6ea4-43b5-adb1-18f068f126b9/images/955ed078-0941-4ae6-b56e-964379a29365.jpeg)


## ツール
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-tools"></a>

**AWS のサービス**
+ [AWS Database Migration Service (AWS DMS) Schema Conversion](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_SchemaConversion.html) は、さまざまなタイプのデータベース間のデータベース移行をより予測しやすくします。これを使用して、ソースデータプロバイダーの移行の複雑さを評価し、データベーススキーマとコードオブジェクトを変換します。その後、変換したコードをターゲットデータベースに適用できます。
+ [Amazon Aurora PostgreSQL 互換エディション](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html)は、PostgreSQL デプロイのセットアップ、運用、スケーリングに役立つ、フルマネージド型のACID準拠のリレーショナルデータベースエンジンです。
+ [PostgreSQL 向け Amazon Relational Database Service (Amazon RDS)](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html) を使用して、 AWS クラウドで PostgreSQL リレーショナルデータベース (DB) をセットアップ、運用、スケールできます。

その他のツール
+ 「[pgAdmin](https://www.pgadmin.org/)」は PostgreSQL 用のオープンソース管理ツールです。データベースオブジェクトの作成、管理、使用を支援するグラフィカルインターフェイスを提供します。

## ベストプラクティス
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-best-practices"></a>
+ 最上位の呼び出し`reset_vars = 1`には必ず を使用し、内部のサブ呼び出し`reset_vars = 0`には必ず を使用します。
+ `$init` 関数のすべてのデフォルト値を単一の信頼できるソースとして保持します。
+ トレーサビリティのために PostgreSQL で Oracle 変数名を一致させます。
+ Oracle `DBMS_OUTPUT`と PostgreSQL `RAISE NOTICE`出力を比較して検証します。
+ 個別の PostgreSQL セッションでテストして、呼び出し間で変数がリセットされることを確認します。

## エピック
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-epics"></a>

### AWS DMS SC を使用して Oracle パッケージを移行する
<a name="migrate-the-oracle-package-by-using-dms-sc"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
|  AWS DMS SC をセットアップします。 | ソースデータベース AWS DMS への接続を設定します。詳細については、[「DMS Schema Conversion を使用したデータベーススキーマの変換](https://docs.aws.amazon.com/dms/latest/userguide/getting-started.html)」を参照してください。 | DBA、開発者 | 
| スクリプトを変換します。 |  AWS DMS SC を使用して、ターゲットデータベースを Aurora PostgreSQL 互換として選択して Oracle パッケージを変換します。 | DBA、開発者 | 
| .sql ファイルを保存します。 | .sql ファイルを保存する前に、 AWS DMS SC の**プロジェクト設定**オプションを**ステージごとに単一のファイル**に変更します。これにより、オブジェクトタイプに基づいて .sql ファイルを複数の .sql ファイルに分割 AWS DMS するように が設定されます。 | DBA、開発者 | 
| コードを変更してください。 |  AWS DMS SC によって生成された`init`関数を開き、*「追加情報*」セクションの例に示すように変更します。機能 `reset_vars = 0` を実現するための変数が追加されます。 | DBA、開発者 | 
| 変換をテストします。 | `init` 関数を Aurora PostgreSQL 互換データベースにデプロイし、結果をテストします。 | DBA、開発者 | 

## トラブルシューティング
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-troubleshooting"></a>


| 問題 | ソリューション | 
| --- | --- | 
| パッケージ変数にアクセスするときにフィールドが存在しません。 | `$init` 関数条件が `IF v_need_init`または を使用し`reset_vars = 1`、セッションの最初のアクセス時に変数が常に作成されることを確認します。 | 
| 最上位の呼び出し間でリセットされない変数、または内部サブ呼び出し中に予期せずリセットされない変数。 | 直接の最上位呼び出し`reset_vars = 1`には を使用し、内部function-to-function呼び出し`reset_vars = 0`には を渡します。 | 

## 関連リソース
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-resources"></a>
+ [AWS DMS スキーマ変換](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_SchemaConversion.html)
+ 「[Amazon RDS](https://aws.amazon.com/rds/)」 
+ 「[Amazon Aurora 機能](https://aws.amazon.com/rds/aurora/postgresql-features/)」
+ 「[SERIALLY\_REUSABLE Pragma プラグマ](https://docs.oracle.com/cd/B28359_01/appdev.111/b28370/seriallyreusable_pragma.htm#LNPLS01346)」

## 追加情報
<a name="migrate-oracle-serially-reusable-pragma-packages-into-postgresql-additional"></a>

```
-------Source Oracle Code:
CREATE OR REPLACE PACKAGE test_pkg_var IS
  PRAGMA SERIALLY_REUSABLE;
  PROCEDURE function_1(test_id NUMBER);
  PROCEDURE function_2(test_id NUMBER);
END;
/
CREATE OR REPLACE PACKAGE BODY test_pkg_var IS
  PRAGMA SERIALLY_REUSABLE;
  v_char VARCHAR2(20) := 'DEFAULT_VALUE';
  v_num NUMBER := 123;
  PROCEDURE function_2(test_id NUMBER) IS
  BEGIN dbms_output.put_line('function_2 => v_char=' || v_char || ', v_num=' || v_num); END;
  PROCEDURE function_1(test_id NUMBER) IS
  BEGIN
    dbms_output.put_line('function_1 => v_char=' || v_char || ', v_num=' || v_num);
    v_char := 'MODIFIED_VALUE';
    dbms_output.put_line('function_1 => v_char after update=' || v_char);
    function_2(0);
  END;
END test_pkg_var;
/
SET SERVEROUTPUT ON
EXEC test_pkg_var.function_1(1);
EXEC test_pkg_var.function_2(1);
------Target PostgreSQL Code:
CREATE SCHEMA IF NOT EXISTS testoracle;
CREATE OR REPLACE FUNCTION testoracle.test_pkg_var$init(reset_vars IN INTEGER DEFAULT 0) RETURNS void AS $BODY$
DECLARE v_need_init BOOLEAN;
BEGIN
  v_need_init := aws_oracle_ext.packageinitialize(proutinename => 'testoracle.test_pkg_var');
  IF v_need_init OR reset_vars = 1 THEN
    PERFORM aws_oracle_ext.setglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', pval => 'DEFAULT_VALUE'::CHARACTER VARYING(20));
    PERFORM aws_oracle_ext.setglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_num', pval => 123);
  END IF;
END; $BODY$ LANGUAGE plpgsql;
CREATE OR REPLACE PROCEDURE testoracle.test_pkg_var$function_1(reset_vars INT DEFAULT 1) AS $BODY$
BEGIN
  PERFORM testoracle.test_pkg_var$init(reset_vars);
  RAISE NOTICE 'function_1 => v_char=%, v_num=%', aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', ptp => NULL::CHARACTER VARYING(20)), aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_num', ptp => NULL::DOUBLE PRECISION);
  PERFORM aws_oracle_ext.setglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', pval => 'MODIFIED_VALUE'::CHARACTER VARYING(20));
  RAISE NOTICE 'function_1 => v_char after update=%', aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', ptp => NULL::CHARACTER VARYING(20));
  CALL testoracle.test_pkg_var$function_2(0);
END; $BODY$ LANGUAGE plpgsql;
CREATE OR REPLACE PROCEDURE testoracle.test_pkg_var$function_2(reset_vars INT DEFAULT 1) AS $BODY$
BEGIN PERFORM testoracle.test_pkg_var$init(reset_vars);
  RAISE NOTICE 'function_2 => v_char=%, v_num=%', aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_char', ptp => NULL::CHARACTER VARYING(20)), aws_oracle_ext.getglobalvariable(proutinename => 'testoracle.test_pkg_var', pvariable => 'v_num', ptp => NULL::DOUBLE PRECISION);
END; $BODY$ LANGUAGE plpgsql;
CALL testoracle.test_pkg_var$function_1(1); -- loads defaults, sets v_char='MODIFIED_VALUE', function_2 sees 'MODIFIED_VALUE'
CALL testoracle.test_pkg_var$function_2(1); -- new transcation: PRAGMA reset, sees 'DEFAULT_VALUE'
```