如何通过从 SAP HANA 中的 Table 函数映射的输入参数传递多个条目
How do I pass multiple entries through an input parameter mapped from a Table Function in SAP HANA
如何通过从 SAP HANA 中的 Table 函数映射的输入参数传递多个条目?
我写了一个 Table 函数,输入参数是 IN_FORMAT_CD
。
我已将此参数映射到在我的计算视图中创建的参数。
当我只传递一个值(比如 100)时,我能够检索数据。
但是当我传递多个值时,它不会给出任何结果。
是否有相同的解决方法?
我的table函数:
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;
不可能从单个 sql 变量中生成(!)多个项目,除非您拆分它们
在您的 SQL 子选择查询中,将 return 只有 FORMAT_CD 列值与 IN_FORMAT_CD 参数完全相同的行。
如果此参数表示多个值,则此参数是每个子项的串联字符串表示。所以我们可以把它们分开。
拆分将动态生成一个 table 可用于选择。
请创建 user-defined 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;
您要查找的是APPLY_FILTER
function of 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');
此方法将在读取 table 数据时将唯一 ID 列表下推以用作过滤器。然而,这仍然是dynamic SQL so you lose benefits like plan sharing and risk SQL injection attacks. Read more on this e.g. here。
如果可能,您希望在应用程序代码中处理选择列表。
反过来,这也让您可以选择使用 IN-lists 还是针对临时 table 的内部联接是最适合您情况的方法。
如果您想将选择列表作为字符串使用,您至少应该确保未使用常见的 SQL 注入攻击并且 "in-list" 实际上只包含可能的ID 值和逗号。
如何通过从 SAP HANA 中的 Table 函数映射的输入参数传递多个条目?
我写了一个 Table 函数,输入参数是 IN_FORMAT_CD
。
我已将此参数映射到在我的计算视图中创建的参数。
当我只传递一个值(比如 100)时,我能够检索数据。
但是当我传递多个值时,它不会给出任何结果。
是否有相同的解决方法?
我的table函数:
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;
不可能从单个 sql 变量中生成(!)多个项目,除非您拆分它们
在您的 SQL 子选择查询中,将 return 只有 FORMAT_CD 列值与 IN_FORMAT_CD 参数完全相同的行。
如果此参数表示多个值,则此参数是每个子项的串联字符串表示。所以我们可以把它们分开。 拆分将动态生成一个 table 可用于选择。
请创建 user-defined 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;
您要查找的是APPLY_FILTER
function of 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');
此方法将在读取 table 数据时将唯一 ID 列表下推以用作过滤器。然而,这仍然是dynamic SQL so you lose benefits like plan sharing and risk SQL injection attacks. Read more on this e.g. here。
如果可能,您希望在应用程序代码中处理选择列表。 反过来,这也让您可以选择使用 IN-lists 还是针对临时 table 的内部联接是最适合您情况的方法。
如果您想将选择列表作为字符串使用,您至少应该确保未使用常见的 SQL 注入攻击并且 "in-list" 实际上只包含可能的ID 值和逗号。