@GETVAL

使用 @GETVAL 函數從預存程序或查詢擷取值,讓它們可作為 MAP 或 TABLE 敘述句之 FILTER 或 COLMAP 子句的輸入。

是否可以使用 @GETVAL 擷取 <parameter> 值,視下列情況而定:

  1. 預存程序或查詢是否順利執行。

  2. 預存程序或查詢結果是否已過期。

無法擷取值時,@GETVAL 函數會產生「遺漏資料欄」條件。通常,如果資料庫只記錄已變更之資料欄的值,更新作業就會發生這種情況。

這通常表示無法對應資料欄。若要測試遺漏的資料欄值,請使用 @COLTEST 函數來測試 @GETVAL 的結果,然後視需要對應資料欄的替代值以補償遺漏的值。或者,若要確保資料欄值可供使用,您可以使用 TABLE 或 MAP 參數的 FETCHCOLS 或 FETCHCOLSEXCEPT 選項,從資料庫擷取值 (如果日誌中沒有這些值)。啟用必要資料欄的補充日誌記錄也會有效。

語法

@GETVAL (<name>.<parameter>)

<name>

預存程序或查詢的 <name>。使用 SQLEXEC 執行程序或查詢時,有效值如下:

對於查詢,請使用以 SQLEXEC 子句的 ID 選項指定的邏輯名稱。ID 是查詢的必要 SQLEXEC 引數。

對於預存程序,請根據要在 TABLE 或 MAP 敘述句內執行的程序次數,使用下列其中一項:

<parameter>

有效值為下列其中一項。

替代語法

使用 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);