【发布时间】:2017-03-05 18:07:42
【问题描述】:
假设我在脚本计算视图中有一些 SQL 脚本,它采用单个值输入参数并为另一个计算视图中的输入参数生成一个包含多个输入的字符串。
BEGIN
declare paramStr clob;
params = select foo
from bar
where bar.id = :IP_ID;
select '''' || string_agg(foo, ''', ''') || ''''
into paramStr
from :params;
var_out = select *
from "_SYS_BIC"."somepackage/MULTIPLE_IP_VIEW"(PLACEHOLDER."$$IP_IDS$$" => :paramStr);
END
这按预期工作。但是,如果我更改 var_out 查询并尝试在 where 子句中使用该变量
BEGIN
...
var_out = select *
from "_SYS_BIC"."somepackage/MULTIPLE_IP_VIEW"
where "IP_IDS" in(:paramStr);
END
视图将激活,但我没有从查询中得到任何结果。没有运行时错误,只是一个空的结果集。当我手动将值传递给WHERE IN() 子句时,一切正常。这似乎是一个基本问题,但我似乎无法让它发挥作用。我什至尝试在连接表达式中使用char(39) 而不是'''',但没有香蕉:(
【问题讨论】:
-
在这种情况下您会收到什么错误消息?另外:您的视图名称中缺少双引号。你想在这里做什么?要么将值输入到输入参数或变量中 - 这些都是不可交换的。
-
抱歉,我修正了错字。我没有收到任何激活或运行时错误,当我查询脚本计算视图时,我只是没有得到任何结果,但是当使用
WHERE "SOME_COLUMN" IN('ip1','ip2')表单手动运行查询时,它工作正常。就像我说的那样,像第一个示例一样使用这种 IP 实现效果很好。 -
并不是说它与这个问题有关,但我有复杂的服务,HANA 优化器没有正确地向下推过滤器。例如,如果我有一项服务可以计算单个贷款编号的余额,则 HANA 优化器效果很好,但无法转换输入以传递特定帐号的多个贷款编号。如果没有巨大的性能损失,以图形方式加入这种转换是行不通的。相反,我将图形视图包装在脚本计算视图中以转换输入并使用多个参数查询原始视图,而不会牺牲性能。
-
听起来你做得不对。脚本化的 calcviews 已经被弃用了一段时间,应该使用表函数来代替。如果您必须使用具有多个参数和动态调用的图形计算视图(基本上是您所问的),请参阅我的博客文章。
-
我一直避免使用动态调用,因为有传言说使用动态 sql 会造成性能损失,但似乎使用动态
IN语句有类似的损失。谢谢你的建议,我会考虑的。
标签: hana sql-scripts hana-sql-script