从 UDF 或过程中选择多个参数
Selecting multiple parameters from UDF or procedure
我正在尝试计算多个值并在 select 子句中获取它们。它是通过 UDF 还是通过过程计算的,对我来说并不重要,但我无法弄清楚如何以任何一种方式进行计算。我想这样使用它:
SELECT ID, BITMAP(ID) FROM X;
然后应该 return 一个 table 列 ID, Bitset1, Bitset2
。如果可能,它应该尽可能高效。
我目前有三个版本(简化了,实际计算量更大):
Table UDF
CREATE FUNCTION TPCH.BITMAP(IN col BIGINT)
RETURNS table("BITSET1" bigint, "BITSET2" bigint)
AS BEGIN
declare bitset1, bitset2 bigint;
bitset1 = 1;
bitset2 = 2;
return select bitset1 as "BITSET1", bitset2 as "BITSET2" from sys.dummy;
END;
标量 UDF
CREATE FUNCTION BITMAP(IN col BIGINT)
RETURNS bitset1 bigint, bitset2 bigint
AS BEGIN
declare bitset1, bitset2 bigint;
bitset1 = 1;
bitset2 = 2;
END;
程序
create procedure BITMAP(in col BIGINT,
out bitsets table("BITSET1" bigint, "BITSET2" bigint))
as begin
bitsets = select 1 as "BITSET1", 2 as "BITSET2" from sys.dummy;
end;
如果我从上面执行 select 语句,我会得到不同的异常:
对于TUDF/过程:cannot use procedure or table function in select projection column or cannot use window function w/o OVER: P_BITMAP
对于 SUDF:This user defined function has multiple outputs, but this usage requires a single output. Specify a single output.
我发现对于 SUDF 我可以这样写:
select ID, BITMAP(ID).bitset1, BITMAP(ID).bitset2 from X;
但这会执行 BITMAP(ID) 两次,这会使其变慢。我想一次性获取这两个值。
这甚至可以在 Hana 中完成还是有其他选择?
编辑 1: 澄清一下,udf 和过程通常取决于输入。为简单起见,我在示例中仅 return 1 和 2。
如前所述,在 HANA 1 中存在以下有关用户定义函数的限制:
- table 函数不接受连接的 table 的值作为输入参数。 IE。它们不能用于实现 "lateral join"
- 将为语句中出现的每个实例调用和执行标量函数。从等效调用中获取多个 return 参数也会多次调用该函数。
- table 函数和过程不能用于 SELECT 语句的投影列表(非 HANA 特定)
为了将用户定义的函数并行应用于多个值,HANA 2 提供了多项新功能,例如
MAP_MERGE
函数,实现map-reduce调用模式
- 确定性的用户定义函数,缓存结果,以便后续调用可以使用预先计算的结果
add:可以在此处找到 HANA 2 中 MAP_MERGE 功能的一个很好的示例:https://blogs.sap.com/2016/12/01/sap-hana-2.0-sps-0-new-developer-features-database-development/
我正在尝试计算多个值并在 select 子句中获取它们。它是通过 UDF 还是通过过程计算的,对我来说并不重要,但我无法弄清楚如何以任何一种方式进行计算。我想这样使用它:
SELECT ID, BITMAP(ID) FROM X;
然后应该 return 一个 table 列 ID, Bitset1, Bitset2
。如果可能,它应该尽可能高效。
我目前有三个版本(简化了,实际计算量更大):
Table UDF
CREATE FUNCTION TPCH.BITMAP(IN col BIGINT)
RETURNS table("BITSET1" bigint, "BITSET2" bigint)
AS BEGIN
declare bitset1, bitset2 bigint;
bitset1 = 1;
bitset2 = 2;
return select bitset1 as "BITSET1", bitset2 as "BITSET2" from sys.dummy;
END;
标量 UDF
CREATE FUNCTION BITMAP(IN col BIGINT)
RETURNS bitset1 bigint, bitset2 bigint
AS BEGIN
declare bitset1, bitset2 bigint;
bitset1 = 1;
bitset2 = 2;
END;
程序
create procedure BITMAP(in col BIGINT,
out bitsets table("BITSET1" bigint, "BITSET2" bigint))
as begin
bitsets = select 1 as "BITSET1", 2 as "BITSET2" from sys.dummy;
end;
如果我从上面执行 select 语句,我会得到不同的异常:
对于TUDF/过程:cannot use procedure or table function in select projection column or cannot use window function w/o OVER: P_BITMAP
对于 SUDF:This user defined function has multiple outputs, but this usage requires a single output. Specify a single output.
我发现对于 SUDF 我可以这样写:
select ID, BITMAP(ID).bitset1, BITMAP(ID).bitset2 from X;
但这会执行 BITMAP(ID) 两次,这会使其变慢。我想一次性获取这两个值。
这甚至可以在 Hana 中完成还是有其他选择?
编辑 1: 澄清一下,udf 和过程通常取决于输入。为简单起见,我在示例中仅 return 1 和 2。
如前所述,在 HANA 1 中存在以下有关用户定义函数的限制:
- table 函数不接受连接的 table 的值作为输入参数。 IE。它们不能用于实现 "lateral join"
- 将为语句中出现的每个实例调用和执行标量函数。从等效调用中获取多个 return 参数也会多次调用该函数。
- table 函数和过程不能用于 SELECT 语句的投影列表(非 HANA 特定)
为了将用户定义的函数并行应用于多个值,HANA 2 提供了多项新功能,例如
MAP_MERGE
函数,实现map-reduce调用模式- 确定性的用户定义函数,缓存结果,以便后续调用可以使用预先计算的结果
add:可以在此处找到 HANA 2 中 MAP_MERGE 功能的一个很好的示例:https://blogs.sap.com/2016/12/01/sap-hana-2.0-sps-0-new-developer-features-database-development/