@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

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