

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

# 100 個以上の引数を持つ Oracle 関数とプロシージャを PostgreSQL に移行
<a name="migrate-oracle-functions-and-procedures-that-have-more-than-100-arguments-to-postgresql"></a>

*Amazon Web Services、Srinivas Potlachervoo*

## 概要
<a name="migrate-oracle-functions-and-procedures-that-have-more-than-100-arguments-to-postgresql-summary"></a>

このパターンでは、100 を超える引数を持つ Oracle データベースの関数とプロシージャを PostgreSQL に移行する方法を示しています。例えば、このパターンを使用して Oracle の関数とプロシージャを以下の PostgreSQL 互換の AWS データベースサービスのいずれかに移行できます。
+ PostgreSQL の Amazon Relational Database Service (Amazon RDS) 
+ Amazon Aurora PostgreSQL 互換エディション

PostgreSQLには、100 個以上の引数を持つ関数やプロシージャが適用されません。回避策として、ソース関数の引数と一致するタイプフィールドを持つ新しいデータ型を定義できます。次に、カスタムデータ型を引数として使用する PL/pgSQL 関数を作成して実行できます。

## 前提条件と制限事項
<a name="migrate-oracle-functions-and-procedures-that-have-more-than-100-arguments-to-postgresql-prereqs"></a>

**前提条件**
+ アクティブなAWS アカウント
+ 「[Amazon RDS Oracle Database DB インスタンス](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Oracle.html)」 
+ 「[Amazon RDS for PostgreSQL DB インスタンス](https://aws.amazon.com/getting-started/hands-on/create-connect-postgresql-db/)」 または 「[Aurora PostgreSQL 互換 DB インスタンス](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_GettingStartedAurora.CreatingConnecting.AuroraPostgreSQL.html)」 

**製品バージョン**
+ Amazon RDS Oracle DB インスタンス バージョン 10.2 以降
+ Amazon RDS PostgreSQL DB インスタンス バージョン 9.4 以降、または Aurora PostgreSQL 互換 DB インスタンスバージョン 9.4 以降
+ Oracle SQL Developer バージョン 18 以降
+ pgAdmin バージョン 4 以降

## アーキテクチャ
<a name="migrate-oracle-functions-and-procedures-that-have-more-than-100-arguments-to-postgresql-architecture"></a>

**ソーステクノロジースタック**
+ Amazon RDS Oracle DB インスタンス バージョン 10.2 以降

**ターゲットテクノロジースタック**
+ Amazon RDS PostgreSQL DB インスタンス バージョン 9.4 以降、または Aurora PostgreSQL 互換 DB インスタンス バージョン 9.4 以降

## ツール
<a name="migrate-oracle-functions-and-procedures-that-have-more-than-100-arguments-to-postgresql-tools"></a>

**AWS サービス**
+ 「[PostgreSQL の Amazon Relational Database Service (Amazon RDS)](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html)」 を使用して、AWS クラウドで PostgreSQL リレーショナルデータベース (DB) をセットアップ、運用、スケーリングができます。
+ 「[Amazon Aurora PostgreSQL 互換エディション](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html)」は、PostgreSQL デプロイのセットアップ、運用、スケーリングに役立つ、フルマネージド型のACID準拠のリレーショナルデータベースエンジンです。

**その他のサービス**
+ 「[Oracle SQL Developer](https://www.oracle.com/database/technologies/appdev/sqldeveloper-landing.html)」 は、従来のデプロイとクラウドベースのデプロイの両方で Oracle データベースの開発と管理を簡素化する統合開発環境です。
+ 「[pgAdmin](https://www.pgadmin.org/)」は PostgreSQL のオープンソース管理ツールです。データベースオブジェクトの作成、管理、使用を支援するグラフィカルインターフェイスを提供します。

## ベストプラクティス
<a name="migrate-oracle-functions-and-procedures-that-have-more-than-100-arguments-to-postgresql-best-practices"></a>

作成するデータ型が、ソース Oracle 関数またはプロシージャに含まれる型フィールドと一致することを保証します。

## エピック
<a name="migrate-oracle-functions-and-procedures-that-have-more-than-100-arguments-to-postgresql-epics"></a>

### 100 個以上の引数を持つ Oracle の関数またはプロシージャを実行する
<a name="run-an-oracle-function-or-procedure-that-has-more-than-100-arguments"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| 100個以上の引数を持つ既存の Oracle/plSQL 関数またはプロシージャを作成または識別する。 | 100個以上の引数を持つ Oracle/PLSQL 関数またはプロシージャを作成します。-または-100個以上の引数を持つ既存の Oracle/plSQL 関数またはプロシージャを特定します。詳細については、Oracle データベースのドキュメントのセクション 「[14.7 関数作成ステートメント](https://docs.oracle.com/en/database/oracle/oracle-database/12.2/lnpls/CREATE-FUNCTION-statement.html#GUID-B71BC5BD-B87C-4054-AAA5-213E856651F2)」 と 「[14.11 プロシージャステートメントの作成](https://docs.oracle.com/en/database/oracle/oracle-database/12.2/lnpls/CREATE-PROCEDURE-statement.html#GUID-5F84DB47-B5BE-4292-848F-756BF365EC54)」 を参照してください。 | Oracle/PL/SQL の知識 | 
| Oracle/PLSQL 関数またはプロシージャをコンパイルします。 | Oracle/PLSQL 関数またはプロシージャをコンパイルします。詳細については、Oracle データベースドキュメントの「[関数のコンパイル](https://docs.oracle.com/cd/E37097_01/doc.42/e35128/GUID-6B7B6F82-616D-4915-82BE-D4AE7F59CF37.htm#AEUTL165)」を参照してください。 | Oracle/PL/SQL に関する知識 | 
| Oracle/plSQL 関数を実行します。 | Oracle/PLSQL 関数またはプロシージャを実行します。次に、出力を保存します。 | Oracle/PL/SQL の知識 | 

### ソース関数またはプロシージャの引数と一致する新しいデータ型を定義します。
<a name="define-a-new-data-type-that-matches-the-source-functionapos-s-or-procedureapos-s-arguments"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| PostgreSQL で新しいデータ型を定義します。 | ソース Oracle 関数、またはプロシージャの引数と同じフィールドをすべて含む、新しいデータ型を PostgreSQL で定義します。詳細については、PostgreSQL のドキュメントの「[型の作成](https://www.postgresql.org/docs/current/sql-createtype.html)」 を参照してください。 | PostgreSQL PL/pgSQL の知識 | 

### 新しい型引数を含む PostgreSQL 関数を作成します。
<a name="create-a-postgresql-function-that-includes-the-new-type-argument"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| 新しいデータ型を含む PostgreSQL 関数を作成します。 | 新しい `TYPE` 引数を含む PostgreSQL 関数を作成します。サンプル関数を確認するには、このパターンの「**追加情報**」セクションを参照してください。 | PostgreSQL PL/pgSQL の知識 | 
| PostgreSQL 関数をコンパイルします。 | PostgreSQL で関数をコンパイルします。新しいデータ型フィールドがソース関数またはプロシージャの引数と一致すれば、関数は正常にコンパイルされます。 | PostgreSQL PL/pgSQL の知識 | 
| PostgreSQL 関数を実行します。 | PostgreSQL 関数を実行します。 | PostgreSQL PL/pgSQL の知識 | 

## トラブルシューティング
<a name="migrate-oracle-functions-and-procedures-that-have-more-than-100-arguments-to-postgresql-troubleshooting"></a>


| 問題 | ソリューション | 
| --- | --- | 
| 関数は、次のエラーを返します：**エラー:「<statement>」付近の構文エラー** | 関数のステートメントが、すべてセミコロン (`;`) で終わっていることを確認してください。 | 
| 関数は、次のエラーを返します：**エラー:「<variable>」が既知の変数ではありません** | 関数ボディで使用されている変数が、関数の `DECLARE` セクションに確実にリストされているようにします。 | 

## 関連リソース
<a name="migrate-oracle-functions-and-procedures-that-have-more-than-100-arguments-to-postgresql-resources"></a>
+ 「[Amazon Aurora PostgreSQL との連携](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html)」 (* Amazon Aurora ユーザーガイド*)
+ 「[型の作成](https://www.postgresql.org/docs/11/sql-createtype.html)」(PostgreSQL ドキュメント)

## 追加情報
<a name="migrate-oracle-functions-and-procedures-that-have-more-than-100-arguments-to-postgresql-additional"></a>

**タイプ引数を含むPostgreSQL関数の例**

```
CREATE OR REPLACE FUNCTION test_proc_new
(
    IN p_rec type_test_proc_args
) 
RETURNS void
AS
$BODY$
BEGIN

    /*
    **************
    The body would contain code to process the input values.
    For our testing, we will display couple of values.
    ***************
    */
    RAISE NOTICE USING MESSAGE = CONCAT_WS('', 'p_acct_id: ', p_rec.p_acct_id);
    RAISE NOTICE USING MESSAGE = CONCAT_WS('', 'p_ord_id: ', p_rec.p_ord_id);
    RAISE NOTICE USING MESSAGE = CONCAT_WS('', 'p_ord_date: ', p_rec.p_ord_date);
   
END;
$BODY$
LANGUAGE plpgsql 
COST 100;
```