次の方法で共有


Oracle パッケージ変数のエミュレーション

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

  • 処置と関数 - パブリックとプライベートの両方
  • 変数
  • カーソル
  • 初期化ルーチン

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

変換の基本

パッケージ変数を格納するために、SSMA for Oracle では、ssma_oracle.db_storage テーブルと共に特殊な ssma_oracle スキーマに存在するストアド プロシージャが使用されます。 このテーブルは、(セッション識別子) とログイン時間によって 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
DATE ssma_oracle.set_pv_datetime2
CHAR ssma_oracle.set_pv_varchar
INT ssma_oracle.set_pv_float
FLOAT ssma_oracle.set_pv_float

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