如何通过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;
答案 0 :(得分:1)
您要找的是APPLY_FILTER
的SAP 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;