@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
通过以下方法,每个映射语句都可以在 @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);