Как преодолеть функцию grouping (), не поддерживаемую UDF таблицы HANA? - PullRequest
0 голосов
/ 19 июня 2020

Я написал несколько пользовательских logi c в анонимном блоке HANA. Я использовал функцию группировки где-то посередине в качестве ядра. Это сработало хорошо, и результат был удовлетворительным. Как только я попытался индустриализировать его, перейдя к табличной функции HANA, активация прошла успешно, однако функция начала выдавать ошибку, как показано ниже, при попытке выбрать из нее.

Не удалось выполнить 'udf_foo ()' SAP DBTech JDB C: [7]: функция не поддерживается: функции grouping_id () или grouping () должны использоваться с наборами группировки

Не могли бы вы сказать, официально ли операция grouping () не поддерживается по UDF таблицы на HANA? Я использую HANA 1.0 SPS 12. В качестве обходного пути я использовал операторы case.

Способ воспроизведения:

do begin sequential execution
    create column table t1 ( id int primary key, customer varchar(5), year int, product varchar(5), sales int );
    insert into t1 values(1, 'C1', 2009, 'P1', 100);
    insert into t1 values(2, 'C1', 2009, 'P2', 200);
    insert into t1 values(3, 'C1', 2010, 'P1', 50);
    insert into t1 values(4, 'C1', 2010, 'P2', 150);
    insert into t1 values(5, 'C2', 2009, 'P1', 200);
    insert into t1 values(6, 'C2', 2009, 'P2', 300);
    insert into t1 values(7, 'C2', 2010, 'P1', 100);
    insert into t1 values(8, 'C2', 2010, 'P2', 150);
end;

CREATE FUNCTION udf_grp_test ( ) 
    RETURNS TABLE(
        CUSTOMER        NVARCHAR(2) ,
        YEAR            INT,
        PRODUCT         NVARCHAR(2) ,
        GRP_YEAR        NVARCHAR(1) ,
        SALES           DEC(3,0)
)
AS BEGIN

    RETURN
        SELECT
            CUSTOMER,
            YEAR,
            PRODUCT,
            GROUPING( YEAR ) AS GRP_YEAR,
            SUM(SALES) AS SALES
        FROM
            T1
        GROUP BY GROUPING SETS(
            ( CUSTOMER, YEAR),
            ( CUSTOMER, PRODUCT)
        );

END

-- Works well
SELECT
    CUSTOMER,
    YEAR,
    PRODUCT,
    GROUPING( YEAR ) AS GRP_YEAR,
    SUM(SALES)
FROM
    T1
GROUP BY GROUPING SETS(
    ( CUSTOMER, YEAR),
    ( CUSTOMER, PRODUCT)
)

-- Throws error     
SELECT * FROM udf_grp_test ( ) 

ps. Я обнаружил, что все ошибки, описанные в https://answers.sap.com/questions/11570257/sap-hana-usage-of-grouping.html, до сих пор не исправлены в SPS 12.

1 Ответ

1 голос
/ 21 июня 2020

Большое спасибо за действительно хороший пример воспроизведения. Вот как это должно быть сделано, и это позволяет легко воспроизвести проблему. Отлично!

Теперь у меня больше нет HANA 1 SPS 12 (и я давно его не использовал). Итак, я попробовал это с текущим HANA Express Edition HANA 2 SPS04, и у меня не было никаких проблем.

UDF работает правильно, а других упомянутых ошибок 2015 года больше нет.

Хотя HANA 1 SPS 12 все еще поддерживается, вопрос здесь в том, когда используемая вами сборка. HANA 1 не увидит новых SP, поэтому все исправления ошибок выполняются в ветви SPS 12. Это означает, что, возможно, вы сможете установить текущую сборку и проблемы, с которыми вы столкнетесь, будут исправлены. это.

Два замечания о примере кода:

  • ключевые слова SEQUENTIAL EXECUTION не нужны. Как только в блоке указан DML для изменения данных, по умолчанию выполняется последовательное выполнение.
  • структура таблицы возврата табличной функции отличается от определения таблицы (CUSTOMER - это NVARCHAR(5) в таблице, но NVARCHAR(2) в табличной функции. В HANA 2 это приводит к предупреждению компилятора: java.sql.SQLWarning: general warning: Type mismatch for table variable "_SYS_SS2_RETURN_VAR_": Target type "NVARCHAR(2)" of attribute "CUSTOMER" not same as assigned type "VARCHAR(5)": line 11 col 5 (at pos 245)
...