Oracle パッケージ変数のエミュレート

Oracle では、変数、型、ストアド プロシージャ、関数のパッケージへのカプセル化がサポートされています。 Oracle パッケージを変換するときは、次の変換を行う必要があります。

  • プロシージャと関数 - パブリックとプライベートの両方
  • 変数
  • Cursors
  • 初期化ルーチン

この記事では、Sql Server Migration Assistant (SSMA) for Oracle がパッケージ変数を SQL Server に変換する方法について説明します。

変換の基本

パッケージ変数を格納するために、SSMA for Oracle では、特殊な ssma_oracle スキーマに存在するストアド プロシージャと ssma_oracle.db_storage テーブルが使用されます。 このテーブルは、 SPID (セッション識別子) とログイン時間によってフィルター処理されます。 このフィルター処理を使用すると、異なるセッションの変数を区別できます。

変換された各パッケージ プロシージャの開始時に、SSMA は特別なプロシージャ ssma_oracle.db_check_init_package 呼び出しを行います。これは、パッケージが初期化されているかどうかを確認し、必要に応じて初期化します。 各初期化プロシージャは、ストレージ テーブルをクリーンアップし、各パッケージ変数の既定値を設定します。

いくつかのパッケージ変数を変換する例を次に示します。

CREATE OR REPLACE PACKAGE MY_PACKAGE
IS
    space varchar(1) := ' ';
    unitname varchar(128) := 'My Simple Package';
    ts date := sysdate;
END;

SSMA は、それを次の Transact-SQL コードに変換します。

CREATE PROCEDURE dbo.MY_PACKAGE$SSMA_Initialize_Package
AS
BEGIN
    EXECUTE ssma_oracle.db_clean_storage

    EXECUTE ssma_oracle.set_pv_varchar
        DB_NAME(),
        'DBO',
        'MY_PACKAGE',
        'SPACE',
        ' '

    EXECUTE ssma_oracle.set_pv_varchar
        DB_NAME(),
        'DBO',
        'MY_PACKAGE',
        'UNITNAME',
        'My Simple Package'

    DECLARE
        @temp datetime2

    SET @temp = sysdatetime()

    EXECUTE sysdb.ssma_oracle.set_pv_datetime2
      DB_NAME(),
      'DBO',
      'MY_PACKAGE',
      'TS',
      @temp
END

パッケージ変数の Get メソッドと Set メソッドのエミュレート

Oracle では、パッケージ変数の Get メソッドと Set メソッドを使用して、他のサブプログラムで直接読み書きすることを回避します。 同じセッション内のサブプログラム呼び出し間で一部の変数を使用できるようにする必要がある場合、これらの変数はグローバル変数と同様に扱われます。

このスコープ規則を克服するために、SSMA for Oracle では、変数の種類ごとに ssma_oracle.set_pv_varchar などのストアド プロシージャが使用されます。 これらの変数にアクセスするために、SSMA はトランザクションに依存しない一連の get_*set_* プロシージャと関数を使用します。

Oracle のデータ型 SSMA Set プロシージャ
VARCHAR ssma_oracle.set_pv_varchar
日付 ssma_oracle.set_pv_datetime2
CHAR ssma_oracle.set_pv_varchar
INT ssma_oracle.set_pv_float
フロート ssma_oracle.set_pv_float

異なるセッションから変数を区別するために、SSMA は変数を SPID (セッション識別子) とセッションのログイン時間と共に格納します。 したがって、 get_* プロシージャと set_* プロシージャは、変数を実行しているセッションから独立して保持します。