@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。 -
如果是單一執行,請使用實際的預存程序名稱。
<parameter>
有效值為下列其中一項。
-
預存程序或查詢中將從中擷取資料並傳送至資料欄對應的參數名稱。
-
RETURN_VALUE,如果擷取預存程序或查詢所傳回的值。
替代語法
使用 SQLEXEC 時,您可以擷取參數結果,而不需要明確地使用 @GETVAL 關鍵字。只要以下列格式參照程序名稱 (如果使用查詢或多個程序執行處理,則為邏輯名稱) 和參數:
{<procedure_name> | <logical_name>}.<parameter>
範例,標準語法
範例 1
下列可讓每個 map 敘述句透過參照 @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。在此情況下,會使用程序的實際名稱。不需要邏輯名稱。
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 關鍵字的詞組 proc1.p2,會隱含地呼叫 @GETVAL。
MAP test.tab1, TARGET test.tab2,
SQLEXEC (SPNAME proc1, ID myproc, PARAMS (p1 = sourcecol1)),
COLMAP (targcol1 = proc1.p2);
範例 2
在下列範例中,對於不含 @GETVAL 關鍵字的詞組 lookup.desc_param,會隱含地呼叫 @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 = lookup.desc_param);