使用来自 java 的 HANA PLACEHOLDER 查询和命名参数替换

Using HANA PLACEHOLDER query from java with named parameter replacement

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

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

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

不同于 HANA 中的 WHERE 子句占位符是 non-standard/proprietary 语法扩展。
这个想法是查询可以为视图提供额外的信息——通常是过滤条件,否则在处理过程中 "push-down" 是不可能的。

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

关于"passing values dynamically"问题:旧的占位符语法不支持SQL查询parameters/host变量替换(查询文本中的?)。
为此,您需要使用参数语法的新变体。

另见

函数 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%'' ')

我不是专家,但对于 hana 2.0 SPS04: 我认为您的语法不正确,您需要为多个输入参数使用以下语法: -- option 1 - no WITH PARAMETERS clause SELECT "FOO" FROM "_SYS_BIC"."public.FOO_CV"( 'PLACEHOLDER' = ('$$IP2$$','1'), 'PLACEHOLDER' = ('$$IP1$$','2'), 'PLACEHOLDER' = ('$$CE_SUPPORT$$','d_calcengine')); -- option 2 - WITH PARAMETERS clause SELECT "FOO" FROM "_SYS_BIC"."public.FOO_CV" WITH PARAMETERS ( 'PLACEHOLDER' = ('$$IP2$$','1'), 'PLACEHOLDER' = ('$$IP1$$','2'), 'PLACEHOLDER' = ('$$CE_SUPPORT$$','d_calcengine')); -- option 3 - mixed SELECT "FOO" FROM "_SYS_BIC"."public.FOO_CV" WITH PARAMETERS ( 'PLACEHOLDER' = ('$$IP2$$','1'), 'PLACEHOLDER' = ('$$IP1$$','2')) WITH PARAMETERS ('PLACEHOLDER' = ('$$CE_SUPPORT$$','d_calcengine'));

您使用的语法适用于回答允许多个值作为答案的输入参数。

这里,IP1 和 IP2 是在计算视图中创建的,而 CE_SUPPORT 输入参数有点不同 - 它可以指定给任何计算视图(有或没有 WITH PARAMETERS 子句)并且是不是简历定义的一部分。

关于WHERE子句和PLACEHOLDER语法的区别,区别如下:

  1. 语法不同(dough)

  2. 这是两个不同的东西 - WHERE 用于 WHERE 子句,PLACEHOLDER 用于传递输入参数答案(面团)

  3. 要点 2. 只有当您知道什么是输入参数时才有意义 - 这些是可以在 sap hana 中以多种方式使用的对象。它们可以为您提供与 WHERE 子句完全相同的结果,但也可以用于其他方式,例如计算列、输入参数的映射、我认为的派生列、货币转换等。