使用Java中的HANA PLACEHOLDER查询并替换命名参数

问题描述 投票:0回答:2

[有人可以向我解释一下,在SAP HANA查询中使用PLACEHOLDERWHERE之间的区别。我是SAP HANA的新手,在springboot应用程序中,我必须使用一个PLACEHOLDER查询来从计算视图中获取一些数据。问题是,当将spring数据jpa与SAP HANA一起使用时,由于某种原因,PLACEHOLDER查询无法在查询创建期间动态替换值。例如查询:

select * from SOME_TABLE ('PLACEHOLDER' = ('$$IP_SOME_COLUMN1$$', 'value1') ,('$$IP_SOME_COLUMN2$$', 'value2'));

[每当我们尝试将值动态传递给此查询时,由于某种原因,查询创建都会失败。因此,我们希望改用大家都熟悉的WHERE子句,但需要澄清它们之间的区别以及它可能如何影响性能。

java spring-boot sap hana
2个回答
1
投票

与HANA中的WHERE子句占位符不同,它是非标准/专有语法扩展名。这个想法是查询可以向视图提供其他信息-通常是过滤条件,否则将无法在处理过程中“下推”。

这些概念在它们的用例中重叠,但是在实现和意义上完全不同。

关于“动态传递值”问题:旧的占位符语法不支持SQL查询参数/主机变量替换(查询文本中的?)。为此,您需要使用参数语法的新变体。

另请参见How to escape sql injection from HANA placeholder


0
投票

[APPLY_FILTER函数将应用SQL谓词,就像将其添加到where子句一样。在下面的示例中,变量sql_filter包含一个我们希望在不使用动态SQL的情况下应用的复杂过滤谓词。这是在星期五创建的所有视图的列表:

do begin
  declare sql_filter nvarchar(200) = 'weekday(create_time)=4'; 
  tv= select dayname(create_time) as create_day, schema_name, view_name
  from VIEWS;
  res=APPLY_FILTER(:tv, :sql_filter);
  select * from :res;
end;

这种带有do begin和table变量的构造从客户端应用程序调用起来并不容易,因此我建议您改写一个table函数:

create or replace function DYN_FILTER_VIEWS(
    IN SQL_FILTER NVARCHAR(1000)
) RETURNS TABLE (
    create_day nvarchar(20), 
    schema_name nvarchar(255),
    view_name nvarchar(255)
)as
begin
  tv= select dayname(create_time) as create_day, schema_name, view_name 
  from VIEWS;
  res=APPLY_FILTER(:tv, :SQL_FILTER);
  return select * from :res;
end;

从应用程序中,您可以通过将参数传递给准备好的语句来简单安全地调用它:

select * from DYN_FILTER_VIEWS('view_name like ''%ELT%'' ')
© www.soinside.com 2019 - 2024. All rights reserved.