Выбор нескольких параметров из UDF или процедуры
Я пытаюсь вычислить несколько значений и получить их в предложении выбора. Для меня это не имеет значения, вычислено ли это с помощью UDF или процедуры, но я не могу понять, как это сделать в любом случае. Я хочу использовать это так:
SELECT ID, BITMAP(ID) FROM X;
который затем должен вернуть таблицу со столбцами ID, Bitset1, Bitset2
, Если возможно, он должен быть максимально эффективным.
В настоящее время у меня есть три версии (упрощенно, фактических вычислений больше):
Таблица UDF
CREATE FUNCTION TPCH.BITMAP(IN col BIGINT)
RETURNS table("BITSET1" bigint, "BITSET2" bigint)
AS BEGIN
declare bitset1, bitset2 bigint;
bitset1 = 1;
bitset2 = 2;
return select bitset1 as "BITSET1", bitset2 as "BITSET2" from sys.dummy;
END;
Скалярный UDF
CREATE FUNCTION BITMAP(IN col BIGINT)
RETURNS bitset1 bigint, bitset2 bigint
AS BEGIN
declare bitset1, bitset2 bigint;
bitset1 = 1;
bitset2 = 2;
END;
Процедура
create procedure BITMAP(in col BIGINT,
out bitsets table("BITSET1" bigint, "BITSET2" bigint))
as begin
bitsets = select 1 as "BITSET1", 2 as "BITSET2" from sys.dummy;
end;
Если я выполню оператор выбора сверху, я получу другие исключения:
Для TUDF/Процедура: cannot use procedure or table function in select projection column or cannot use window function w/o OVER: P_BITMAP
Для SUDF: This user defined function has multiple outputs, but this usage requires a single output. Specify a single output.
Я понял, что для SUDF я могу написать это так:
select ID, BITMAP(ID).bitset1, BITMAP(ID).bitset2 from X;
Но это выполняет BITMAP(ID) дважды, что делает его медленным. Я хочу получить оба значения за один раз.
Это вообще возможно сделать в хане или есть другие варианты?
РЕДАКТИРОВАТЬ 1: для уточнения udfs и процедуры обычно зависят от ввода. Я просто возвращаю 1 и 2 в примере для простоты.
1 ответ
Как уже говорилось, в HANA 1 существуют следующие ограничения, касающиеся пользовательских функций:
- Табличные функции не принимают значения объединенных таблиц в качестве входных параметров. Т.е. их нельзя использовать для реализации "бокового соединения"
- скалярные функции будут вызываться и выполняться для каждого экземпляра, встречающегося в операторе. Выборка нескольких возвращаемых параметров из эквивалентных вызовов также вызовет функцию несколько раз.
- табличные функции и процедуры нельзя использовать в списке проекций оператора SELECT (не зависит от HANA)
Чтобы применить пользовательскую функцию ко многим значениям параллельно, HANA 2 предоставляет несколько новых функций, например
MAP_MERGE
функция, чтобы реализовать шаблон вызова карты уменьшить- детерминированные пользовательские функции, которые кэшируют результаты, так что последующие вызовы могут использовать предварительно вычисленный результат
добавить: хороший пример для функции MAP_MERGE в HANA 2 можно найти здесь: https://blogs.sap.com/2016/12/01/sap-hana-2.0-sps-0-new-developer-features-database-development/