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_*
処置は、変数を実行しているセッションから独立して変数を保持します。