3.8.2. 仮想手順
仮想手順は、Data Virtualization の手順言語を使用して定義されます。詳細は、「 手順言語」を参照し てください。
仮想手順では、0 つ以上の INPUT、INOUT、OUT パラメーター、オプションの RETURN パラメーター、および任意の結果セットがあります。仮想手順では、クエリーおよびその他の SQL コマンドの実行、一時テーブルの定義、一時テーブルへのデータの追加、結果セットの実行、ループの使用、および条件付きロジックの使用を行うことができます。
仮想手順の定義
詳細は、スキーマオブジェクトの DDL メタデータ での 手順/機能の作成 について参照してください。
オプションの result パラメーターは、常に最初のパラメーターとみなされます。
この手順のボディーでは、有効なステートメントを使用できます。プロシージャー言語ステートメントの詳細は、「ステップ言語」を参照してください。???
ステートメントが明示的なカーソルや値を返すことはありません。代わりに、結果セットを返す手順で実行される、最後に名前のないコマンドステートメントが結果として返されます。そのステートメントの出力は、手順の予想される結果セットとパラメーターと一致する必要があります。
仮想手順のパラメーター
仮想手順では、ゼロまたは
パラメーターを取り、任意の数の IN
OUTOUT
パラメーターと任意の RETURN
パラメーターを指定できます。各入力には、ランタイム処理中に使用される以下の情報があります。
- 名前
- 入力パラメーターの名前。
- データタイプ
- 入力パラメーターの設計時間タイプ。
- デフォルト値
- 入力パラメーターが指定されていない場合のデフォルト値。
- Null 許容型
-
NO_NULLS
,NULLABLE
,NULLABLE_UNKNOWN
; パラメーターは null 可能である場合にオプションであり、名前付きパラメーター構文を使用する場合は一覧表示する必要はありません。
完全修飾名(またはあいまいな場合)を使用して仮想手順のパラメーターを参照します。例: MySchema.MyProc.Param1
例: 入力パラメーターを参照し、GetBalance
の手順に Out パラメーターを割り当てる
BEGIN MySchema.GetBalance.RetVal = UPPER(MySchema.GetBalance.AcctID); SELECT Balance FROM MySchema.Accts WHERE MySchema.Accts.AccountID = MySchema.GetBalance.AcctID; END
BEGIN
MySchema.GetBalance.RetVal = UPPER(MySchema.GetBalance.AcctID);
SELECT Balance FROM MySchema.Accts WHERE MySchema.Accts.AccountID = MySchema.GetBalance.AcctID;
END
この手順で INOUT
パラメーターの値が割り当てられていない場合は、入力のために割り当てられた値を保持します。値を割り当てられていない OUT/RETURN
パラメーターは、デフォルトの NULL 値を保持します。INOUT/OUT/RETURN
出力値は、パラメーターの NOT NULL
メタデータに対して検証されます。
仮想手順の例
以下の例は、カーソルテーブルを記述し、CONTINUE
および BREAK
を使用するループを示しています。
LOOP、CONTINUE、BREAK を使用した仮想手順
以下の例では、条件付きロジックを使用して、実行する 2 つの SELECT ステートメントを決定します。
条件付き SELECT を使用した仮想手順
仮想手順の実行
SQL EXECUTE
コマンドを使用して手順を実行します。詳細は、「 DML コマンド での コマンドの実行」を参照し てください。
手順に入力が定義されている場合は、連続リストまたは name=value 構文でそれらを指定します。この手順の他の列や変数のコンテキストでパラメーター名が曖昧である場合、完全な手順名によってスコープ指定された入力パラメーターの名前を使用する必要があります。
仮想プロシージャーコールは SELECT
などの結果セットを返すため、これは SELECT
を使用できる場所の多くで使用できます。通常、以下の構文を使用します。
SELECT * FROM (EXEC ...) AS x
SELECT * FROM (EXEC ...) AS x
仮想手順の制限
仮想手順では、結果セットを 1 つだけ返すことができます。結果セットを渡す必要がある場合や、複数の結果セットを渡す必要がある場合には、代わりにグローバル一時テーブルの使用を検討してください。