MAP_MERGE 运算符用于将输入表的每一行应用于映射器函数,并统一所有中间结果表。运算符的目的是用并行运算符替换连续的 FOR-loop 和 union 模式,如下例所示。
示例代码DO (OUT ret_tab TABLE(col_a nvarchar(200))=>?)BEGIN DECLARE i int; DECLARE varb nvarchar(200); t = SELECT * FROM tab; FOR i IN 1 .. record_count(:t) DO varb = :t.col_a[:i]; CALL mapper(:varb, out_tab); ret_tab = SELECT * FROM :out_tab UNION SELECT * FROM :ret_tab; END FOR;END; 备注映射程序是一个只读过程,只有一个输出是表格输出。
= MAP_MERGE(,
(. [ {,
.} … ] [, ])
::= [{, } …] =
| | |
MAP_MERGE 运算符的第一个输入是映射器表
第二个输入是映射器函数
还必须将映射参数
例如,让我们重写上述示例以利用 MAP_MERGE 运算符的并行执行。我们需要将过程转换为表函数,因为 MAP_MERGE 仅支持表函数
示例代码CREATE FUNCTION mapper (IN a nvarchar(200))RETURNS TABLE (col_a nvarchar(200))ASBEGIN ot = SELECT :a AS COL_A from dummy; RETURN :ot;END;
将映射程序转换为函数后,我们现在可以使用 MAP_MERGE 运算符替换整个 FOR 循环。
顺序 FOR-循环版本并行 MAP_Merge 运算符DO (OUT ret_tab TABLE(col_a nvarchar(200))=>?)BEGIN DECLARE i int; DECLARE varb nvarchar(200); t = SELECT * FROM tab; FOR i IN 1 .. record_count(:t) DO varb = :t.col_a[:i]; CALL mapper(:varb, out_tab); ret_tab = SELECT * FROM :out_tab UNION SELECT * FROM :ret_tab; END FOR;END;DO (OUT ret_tab TABLE(col_a nvarchar(200))=>?)BEGIN t = SELECT * FROM tab; ret_tab = MAP_MERGE(:t, mapper(:t.col_a));END;