Может кто-нибудь объяснить мне, в чем разница между использованием PLACEHOLDER и WHERE в запросах sap hana. Я новичок в SAP HANA, и в моем приложении Springboot мне нужно использовать один запрос PLACEHOLDER, чтобы получить некоторые данные из вычисленного представления. Проблема заключается в том, что при использовании пружинных данных jpa вместе с SAP HANA по какой-то причине в запросе PLACEHOLDER не удается динамически заменить значения во время создания запроса. Например, возьмите запрос:

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

Всякий раз, когда мы пытаемся динамически передать значения в этот запрос, по какой-то причине создание запроса завершается неудачно. Таким образом, мы надеялись использовать взамен столь знакомое предложение WHERE, но нам нужно уточнить разницу между ними и то, как это может повлиять на производительность.

1
Ananthapadmanabhan 27 Янв 2020 в 15:52

3 ответа

Лучший ответ

В отличие от WHERE - заполнители в HANA являются нестандартным / проприетарным синтаксическим расширением.
Идея состоит в том, что запрос может предоставить дополнительную информацию для представления - часто это были бы условия фильтрации, которые в противном случае были бы невозможны для «проталкивания» при обработке.

Эти концепции частично совпадают в своих сценариях использования, но полностью различаются по своей реализации и значению в остальном.

Относительно вопроса «динамической передачи значений»: старый синтаксис-заполнитель не поддерживает параметры запроса SQL / замену переменных хоста (символ? В тексте запроса).
Для этого вам нужно использовать новый вариант синтаксиса параметра.

См. Также Как избежать инъекции sql из заполнителя HANA.

1
Lars Br. 29 Янв 2020 в 22:26

Я не эксперт, но для хана 2.0 SPS04: Я думаю, что ваш синтаксис неправильный, вам нужно следующий синтаксис для более чем одного входного параметра: < Код > - вариант 1 - нет предложения WITH PARAMETERS ВЫБЕРИТЕ "FOO" FROM "_SYS_BIC". "Public.FOO_CV" ( 'PLACEHOLDER' = ('$$ IP2 $$', '1'), 'PLACEHOLDER' = ('$$ IP1 $$', '2'), 'PLACEHOLDER' = ('$$ CE_SUPPORT $$', 'd_calcengine')); - вариант 2 - предложение WITH PARAMETERS ВЫБЕРИТЕ "FOO" FROM "_SYS_BIC". "Public.FOO_CV" С ПАРАМЕТРАМИ ( 'PLACEHOLDER' = ('$$ IP2 $$', '1'), 'PLACEHOLDER' = ('$$ IP1 $$', '2'), 'PLACEHOLDER' = ('$$ CE_SUPPORT $$', 'd_calcengine')); - вариант 3 - смешанный ВЫБЕРИТЕ "FOO" FROM "_SYS_BIC". "Public.FOO_CV" С ПАРАМЕТРАМИ ( 'PLACEHOLDER' = ('$$ IP2 $$', '1'), 'PLACEHOLDER' = ('$$ IP1 $$', '2')) WITH PARAMETERS ('PLACEHOLDER' = ('$$ CE_SUPPORT $$', 'd_calcengine'));

Используемый вами синтаксис действителен для ответа на входной параметр, который допускает более одного значения в качестве ответа.

Здесь IP1 и IP2 были созданы в виде расчета, тогда как входной параметр CE_SUPPORT немного отличается - его можно указать для любого представления расчета (с предложением WITH PARAMETERS или без него), и он не является частью определения CV ,

Что касается разницы между предложением WHERE и синтаксисом PLACEHOLDER, то различия следующие:

  1. синтаксис другой (тесто)

  2. это две разные вещи - WHERE используется для предложения WHERE и PLACEHOLDER используется для передачи ответа входного параметра (тесто)

  3. пункт 2. имеет смысл, только если вы знаете, что является входными параметрами - это объекты, которые можно использовать различными способами в sap hana. Они могут дать вам тот же результат, что и предложение WHERE, но также могут быть использованы другими способами, например, в так называемых вычисляемых столбцах, в отображении входных параметров, производных столбцах, которые я считаю, конвертации валют и т. Д.

0
zdunekpawel 23 Апр 2020 в 14:59

Функция APPLY_FIL предсказывает SQLEATE как если бы он был добавлен к предложению 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 variable не так просто вызвать из клиентского приложения, поэтому я рекомендую вместо этого написать табличную функцию:

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%'' ')
0
Remi sap 21 Фев 2020 в 17:24