Stored procedures 从UDF或过程中选择多个参数

Stored procedures 从UDF或过程中选择多个参数,stored-procedures,hana,udf,Stored Procedures,Hana,Udf,我试图计算多个值并在select子句中获取它们。它是通过UDF计算还是通过程序计算对我来说并不重要,但我不知道如何用这两种方法来计算。我想这样使用它: SELECT ID, BITMAP(ID) FROM X; select ID, BITMAP(ID).bitset1, BITMAP(ID).bitset2 from X; 然后它将返回一个包含列ID、位集1、位集2的表。如果可能的话,它应该尽可能的表现 我目前有三个版本(简化版,实际计算量更多): 表格自定义项 CREATE FUNCTI

我试图计算多个值并在select子句中获取它们。它是通过UDF计算还是通过程序计算对我来说并不重要,但我不知道如何用这两种方法来计算。我想这样使用它:

SELECT ID, BITMAP(ID) FROM X;
select ID, BITMAP(ID).bitset1, BITMAP(ID).bitset2 from X;
然后它将返回一个包含列
ID、位集1、位集2
的表。如果可能的话,它应该尽可能的表现

我目前有三个版本(简化版,实际计算量更多):

表格自定义项

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; 
CREATE FUNCTION BITMAP(IN col BIGINT)
RETURNS bitset1 bigint, bitset2 bigint
AS BEGIN
    declare bitset1, bitset2 bigint;
    bitset1 = 1;
    bitset2 = 2;
END; 
标量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; 
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/过程
无法使用“选择投影”列中的过程或表格功能,或者无法使用不覆盖:p_位图的窗口功能

对于SUDF
此用户定义函数有多个输出,但此用法需要一个输出。指定单个输出。

我发现对于SUDF我可以这样写:

SELECT ID, BITMAP(ID) FROM X;
select ID, BITMAP(ID).bitset1, BITMAP(ID).bitset2 from X;
但这会执行位图(ID)两次,这会使它变慢。我想一次性获取两个值

这在Hana中是否可能实现,或者是否有其他选择


编辑1:为了澄清,UDF和程序通常取决于输入。为了简单起见,我在示例中只返回1和2。

如前所述,在HANA 1中,存在以下有关用户定义函数的限制:

  • 表函数不接受联接表的值作为输入参数。也就是说,它们不能用于实现“横向连接”
  • 将为语句中出现的每个实例调用和执行标量函数。从等价调用中获取多个返回参数也将多次调用该函数
  • SELECT语句的投影列表中不能使用表函数和过程(非HANA特定)
为了将用户定义的函数并行应用于多个值,HANA 2提供了多个新功能,例如

  • MAP\u MERGE
    函数,实现MAP reduce调用模式
  • 确定性用户定义函数,用于缓存结果,以便后续调用可以使用预计算的结果

添加:HANA 2中的映射合并功能的一个很好的例子可以在这里找到:

如前所述,HANA 1中存在以下关于用户定义函数的限制:

  • 表函数不接受联接表的值作为输入参数。也就是说,它们不能用于实现“横向连接”
  • 将为语句中出现的每个实例调用和执行标量函数。从等价调用中获取多个返回参数也将多次调用该函数
  • SELECT语句的投影列表中不能使用表函数和过程(非HANA特定)
为了将用户定义的函数并行应用于多个值,HANA 2提供了多个新功能,例如

  • MAP\u MERGE
    函数,实现MAP reduce调用模式
  • 确定性用户定义函数,用于缓存结果,以便后续调用可以使用预计算的结果

add:HANA 2中的MAP\u MERGE功能的一个很好的例子可以在这里找到:

嘿,Lars,这很奇怪,因为TUDF只能在from子句中使用,而过程需要通过CALL调用。您的select语句是什么样子的?当然,它与您的
SELECTID、位图(ID)和X有点不同调用:
SELECT*from BITMAP(1)
。我正在对HANA1进行基准测试,因此我没有使用HANA2的选项,但此功能也适用于HANA1:(为什么不使用当前的HANA版本?我上面的方法很简单,这两个位集通常取决于输入。我只是在那里返回1和2,因为我不知道如何同时获取这两个。因此,应该为表中的每个ID执行UDF:
SELECT ID,(SELECT*from BITMAP(ID))from X;
但这不起作用(
字段或表别名不允许作为表函数的输入
)。如果你说的版本是HANA2,这是一个研究项目,我们想在HANA1上进行测试,因为它使用得更多。但也许我们也会尝试HANA2。嘿,拉尔斯,这很奇怪,因为TUDF只能在from子句中使用,而过程需要通过CALL调用。你的select语句看起来怎么样?当然,它看起来有点不同t到您的
SELECT ID,位图(ID)FROM X;
调用:
SELECT*FROM BITMAP(1)
。我正在对HANA1进行基准测试,因此我没有使用HANA2的选项,但此功能对HANA1也很好:(为什么不使用当前的HANA版本?我上面的方法很简单,这两个位集通常取决于输入。我只是在那里返回1和2,因为我不知道如何同时获取这两个。因此,应该为表中的每个ID执行UDF:
SELECT ID,(SELECT*from BITMAP(ID))from X;
但这不起作用(
字段或表别名不允许作为表函数的输入。
)。如果您所说的版本是HANA2,这是一个研究项目,我们希望在HANA1上进行测试,因为它使用得更多。但也许我们也会尝试HANA2。