Выбор нескольких параметров из 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/

Другие вопросы по тегам