如何克服 HANA Table UDF 不支持的 grouping() 函数?
How to overcome grouping() function not supported by HANA Table UDF?
我在 HANA 匿名块中编写了一些自定义逻辑。我在中间某处使用了分组功能作为核心。它运作良好,结果令人满意。
一旦我尝试通过移动到 HANA Table 函数来实现它的工业化,激活进行得很顺利,但是函数在尝试从它 select 时开始抛出如下错误。
Could not execute 'udf_foo( )'
SAP DBTech JDBC: [7]: feature not supported: grouping_id() or grouping() functions should be used with grouping sets
请问 HANA 上的 Table UDF 是否正式不支持 grouping( ) 操作?
我正在使用 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 中仍未修复。
非常感谢您提供非常好的复制示例。这是应该如何完成的,它可以轻松重现问题。
做得好!
现在,我没有 HANA 1 SPS 12 了(并且已经很久没有使用了)。所以,我用当前的 HANA Express Edition HANA 2 SPS04 试了一下,完全没有问题。
UDF 工作正常,2015 年提到的其他错误已不存在。
虽然 HANA 1 SPS 12 仍受支持,但这里的问题是您使用的版本是什么时候。 HANA 1 不会看到任何更新的 SP,因此所有错误修复都在 SPS 12 分支中完成。这意味着,也许您可以安装当前版本,您遇到的问题将得到解决。
除此之外,如果您使用的 hardware/OS 允许的话,无论如何我都建议您升级到 HANA 2。
关于示例代码的两点说明:
-
SEQUENTIAL EXECUTION
关键字不是必需的。一旦在块中指定了数据更改 DML,执行默认为顺序。
- return table 函数的 table 结构不同于 table 定义(
CUSTOMER
是 NVARCHAR(5)
在 table,但 table 函数中的 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)
我在 HANA 匿名块中编写了一些自定义逻辑。我在中间某处使用了分组功能作为核心。它运作良好,结果令人满意。
一旦我尝试通过移动到 HANA Table 函数来实现它的工业化,激活进行得很顺利,但是函数在尝试从它 select 时开始抛出如下错误。
Could not execute 'udf_foo( )' SAP DBTech JDBC: [7]: feature not supported: grouping_id() or grouping() functions should be used with grouping sets
请问 HANA 上的 Table UDF 是否正式不支持 grouping( ) 操作?
我正在使用 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 中仍未修复。
非常感谢您提供非常好的复制示例。这是应该如何完成的,它可以轻松重现问题。 做得好!
现在,我没有 HANA 1 SPS 12 了(并且已经很久没有使用了)。所以,我用当前的 HANA Express Edition HANA 2 SPS04 试了一下,完全没有问题。
UDF 工作正常,2015 年提到的其他错误已不存在。
虽然 HANA 1 SPS 12 仍受支持,但这里的问题是您使用的版本是什么时候。 HANA 1 不会看到任何更新的 SP,因此所有错误修复都在 SPS 12 分支中完成。这意味着,也许您可以安装当前版本,您遇到的问题将得到解决。
除此之外,如果您使用的 hardware/OS 允许的话,无论如何我都建议您升级到 HANA 2。
关于示例代码的两点说明:
-
SEQUENTIAL EXECUTION
关键字不是必需的。一旦在块中指定了数据更改 DML,执行默认为顺序。 - return table 函数的 table 结构不同于 table 定义(
CUSTOMER
是NVARCHAR(5)
在 table,但 table 函数中的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)