sql - 如何克服 HANA 表 UDF 不支持的 grouping() 函数?
问题描述
我在 HANA 匿名块中编写了一些自定义逻辑。我在中间某处使用了分组功能作为核心。它运作良好,结果令人满意。
一旦我尝试通过移动到 HANA 表函数来将其工业化,激活过程很顺利,但是函数在尝试从中选择时开始抛出如下错误。
无法执行“udf_foo()”SAP DBTech JDBC:[7]:不支持功能:grouping_id() 或 grouping() 函数应与分组集一起使用
您能否告诉 HANA 上的表 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 ( )
附言。我发现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 分支中完成。这意味着,也许您可以安装当前版本并且您遇到的问题将得到修复。
除此之外,如果您使用的硬件/操作系统允许,我建议无论如何升级到 HANA 2。
关于示例代码的两点说明:
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)
推荐阅读
- c - 为什么 realloc 似乎没有扩展内存。realloc 没有按描述工作
- mysql - keycloak docker mysql连接链接失败
- typescript - 打字稿:如果提供了类型,如何要求一个属性,如果没有提供类型,如何禁止该属性?
- java - 自定义注释没有得到参数的值
- python - 为强化学习实现 LSTM 时间步长
- python - 使用 python 读取大型文本文件比使用 Matlab 读取相同文本的相同代码要慢得多,知道为什么吗?
- excel - 使用 Excel 在 Access 中添加/删除记录
- javascript - 未注册具有此名称的控制器 -- 错误:$controller:ctrlreg
- javascript - 动态更新下拉checklst时是否有不同的方法来更新包装器
- heroku - 部署 Jhipster 应用程序时出现 Heroku 错误:创建类路径资源中定义的名称为“servletEndpointRegistrar”的 bean 时出错