如何通过从SAP HANA中的表函数映射的输入参数传递多个条目

时间:2018-03-27 04:26:16

标签: hana

如何通过SAP HANA中的表函数映射的输入参数传递多个条目? 我写了一个输入参数为IN_FORMAT_CD的表函数。 我已将此参数映射到在计算视图中创建的参数。 当我只传递一个值100时,我能够检索数据。 但是当我传递多个值时,它没有结果。 是否有相同的解决方法?

我的表功能:

FUNCTION "HADMIN"."RA.Test.Prathamesh::PH_DEMO" (IN IN_FORMAT_CD NVARCHAR(500)) 
    RETURNS TABLE (NAME NVARCHAR(10), ID NVARCHAR(10), FORMAT_CD NVARCHAR(3))
    LANGUAGE SQLSCRIPT
    SQL SECURITY INVOKER AS
BEGIN
RETURN

SELECT NAME,ID,FORMAT_CD
FROM
HADMIN.PH_DEMO
WHERE FORMAT_CD IN (select :IN_FORMAT_CD as FORMAT_CD from dummy);

END;

2 个答案:

答案 0 :(得分:1)

您要找的是APPLY_FILTERSAP HANA SQLScript功能。

以下示例显示了您的方案的编码方式:

create function get_vals (IN id_list varchar(400))
returns table (id bigint, val varchar(40)) 
as
begin
declare myfilter varchar(450) := ' ID in (' || :id_list || ')';

 _tmp  = select id, val from some_vals;
 _tmp2 = APPLY_FILTER (:_tmp, :myfilter);

 return :_tmp2;
end;

select * 
from 
get_vals ('1, 4, 23, 4, 23, 3');

此方法将在读取表数据时下推唯一的ID列表以用作过滤器。但是,这仍然是dynamic SQL,因此您失去了计划共享和SQL注入攻击风险等好处。阅读更多内容,例如here

如果可能,您希望在应用程序代码中处理选择列表。 反过来,这也可以让您决定是否使用IN列表或内部联接对临时表是最适合您情况的方法。

如果你想将选择列表作为字符串,你应该至少确保不使用常见的SQL注入攻击,并且“列表中”实际上只包含可能的ID值和逗号。< / p>

答案 1 :(得分:0)

除非你拆分它们,否则不可能从单个sql变量生成(!)多个项目

在您的SQL子选择查询中,只返回FORMAT_CD列值与IN_FORMAT_CD参数完全相同的行。

如果此参数表示多个值,则此参数是每个子项的串联字符串表示形式。所以我们可以把它们分开。 拆分将动态生成一个表,可用于选择。

请创建用户定义的HANA Split function fnsplit ,可在参考文档中找到源代码

然后你可以改变你的功能如下,假设每个值与其他人的“,”分开

ALTER FUNCTION "HADMIN"."RA.Test.Prathamesh::PH_DEMO" (IN IN_FORMAT_CD NVARCHAR(500)) 
    RETURNS TABLE (NAME NVARCHAR(10), ID NVARCHAR(10), FORMAT_CD NVARCHAR(3))
    LANGUAGE SQLSCRIPT
    SQL SECURITY INVOKER AS
BEGIN
RETURN

SELECT NAME,ID,FORMAT_CD
FROM
HADMIN.PH_DEMO
WHERE FORMAT_CD IN (
    select str from fnsplit(:IN_FORMAT_CD,',')
);

END;