@GETVAL
@GETVALファンクションでは、ストアド・プロシージャまたは問合せから値を抽出し、MAPまたはTABLE文のFILTERまたはCOLMAP句の入力として使用できるようにします。
@GETVALを使用して<parameter>値を抽出できるかどうかは、次のことに依存します。
-
ストアド・プロシージャまたは問合せの実行の成否。
-
ストアド・プロシージャまたは問合せの結果の失効の有無。
値を抽出できない場合は、@GETVALファンクションの結果が"紛失した列"になる。一般的に、これは、データベースが変更された列の値のみを記録する場合に更新操作に発生します。
通常、これは列をマッピングできないことを意味します。紛失した列値をテストするには、@COLTESTファンクションを使用して@GETVALの結果をテストした後、必要な場合には、紛失した値を補うために、列に代替値をマップします。または、列値を使用可能にするために、TABLEまたはMAPパラメータのFETCHCOLSまたはFETCHCOLSEXCEPTオプションを使用して、値がログに存在しない場合にデータベースから値をフェッチさせます。必要な列のサプリメンタル・ロギングを有効にする方法も有益です。
構文
@GETVAL (<name>.<parameter>)
<name>
ストアド・プロシージャまたは問合せの<name>。SQLEXECを使用してプロシージャまたは問合せを実行すると、次の値が有効です。
問合せでは、SQLEXEC句のIDオプションで指定されている論理名を使用します。IDは、問合せで必須のSQLEXEC引数である。
ストアド・プロシージャでは、TABLEまたはMAP文内でプロシージャを実行する回数に応じて、次のいずれかを使用します。
-
複数回実行するときは、
SQLEXEC文のID句で定義されている論理名を使用します。IDは、1つのプロシージャを複数回実行するときに必須です。 -
1回実行するときは、ストアド・プロシージャの実際の名前を使用します。
<parameter>
有効な値は、次のいずれかです。
-
データを抽出し、列マップに渡すストアド・プロシージャまたは問合せ内のパラメータ名。
-
ストアド・プロシージャまたは問合せが返す値を抽出するときは、
RETURN_VALUE。
代替構文
SQLEXECでは、@GETVALキーワードを明示的に使用せずにパラメータ結果を取得できます。次の形式で、プロシージャ名(問合せまたはプロシージャの複数のインスタンスを使用する場合は論理名)およびパラメータを参照します。
{<procedure_name> | <logical_name>}.<parameter>
例(標準構文)
例1
次の例では、各マップ文が@GETVALファンクション内で論理名lookup1およびlookup2を参照することによって、ストアド・プロシージャlookupをコールし、各結果セットを適切に参照できるようにします。
MAP schema.srctab, TARGET schema.targtab,
SQLEXEC (SPNAME lookup, ID lookup1, PARAMS (param1 = srccol)),
COLMAP (targcol1 = @GETVAL (lookup1.param2));
MAP schema.srctab, TARGET schema.targtab2,
SQLEXEC (SPNAME lookup, ID lookup2, PARAMS (param1 = srccol)),
COLMAP (targcol2= @GETVAL (lookup2.param2));
例2
次の例では、ストアド・プロシージャlookupを1回実行します。このケースでは、実際のプロシージャ名を使用します。論理名は必要ありません。
MAP schema.tab1, TARGET schema.tab2,
SQLEXEC (SPNAME lookup, PARAMS (param1 = srccol)),
COLMAP (targcol = @GETVAL (lookup.param1));
例3
次の例では、問合せを実行し、取得した値を@GETVALを使用してマップします。
MAP sales.account, TARGET sales.newacct,
SQLEXEC (ID lookup,
QUERY ' select desc_col into desc_param from lookup_table '
' where code_col = :code_param ',
PARAMS (code_param = account_code)),
COLMAP (newacct_id = account_id, newacct_val = @GETVAL (lookup.desc_param));
例(代替構文)
例1
次の例では、@GETVALキーワードを使用せずに、@GETVALが暗黙的にproc1.p2で呼び出されます。
MAP test.tab1, TARGET test.tab2,
SQLEXEC (SPNAME proc1, ID myproc, PARAMS (p1 = sourcecol1)),
COLMAP (targcol1 = proc1.p2);
例2
次の例では、@GETVALキーワードを使用せずに、@GETVALファンクションが暗黙的にlookup.desc_paramで呼び出されます。
MAP sales.account, TARGET sales.newacct,
SQLEXEC (ID lookup,
QUERY ' select desc_col into desc_param from lookup_table '
' where code_col = :code_param ',
PARAMS (code_param = account_code)),
COLMAP (newacct_id = account_id, newacct_val = lookup.desc_param);