SAP HANA层级查询标量UDF执行UPDATE操作返回空值问题求助
排查步骤
- 首先单独测试标量UDF的返回值,执行以下SQL验证函数逻辑是否正确:
-- 替换为AP_MYNDIGHED表中实际存在的PROFITCENTER值测试 SELECT "FRS_PRO244"."GET_KNUDEBESKRIVELSE_ON_REQUESTED_LEVEL"('测试用利润中心编码', 2) AS TEST_RESULT FROM DUMMY;
如果返回空,说明函数本身逻辑存在匹配问题,常见原因如下:
- 字段匹配规则不一致:
GAAA_FKO表的Knudenavn字段和AP_MYNDIGHED表的PROFITCENTER字段存在大小写、前后空格、编码格式差异,导致START条件匹配不到起始节点 - 层级取值错误:HIERARCHY函数返回的层级编号起始值为1还是0需要确认,你硬编码的层级2可能不存在对应节点,可以先调整函数输出全层级的结果,确认目标利润中心的层级链的实际层级编号
- 空结果无默认值:SAP HANA中
SELECT INTO语句如果没有匹配到结果,不会抛出异常,只会直接给变量赋值为空,这就是更新时字段被清空的直接原因,可以在函数末尾增加空值兜底逻辑:
-- 函数END前新增 IF KNUDEBESKRIVELSE IS NULL THEN KNUDEBESKRIVELSE := '未匹配'; -- 也可以设置为其他兜底值 END IF;
推荐解决方案
逐行调用标量UDF更新大表性能较差,且调试难度高,建议改用关联更新写法,提前计算好映射关系再批量更新,更稳定易调试:
UPDATE FRS_PRO244.AP_MYNDIGHED t SET MYNDIGHED = h.Knudebeskrivelse FROM ( -- 预先计算所有利润中心对应层级2的节点描述 SELECT start_node."Knudenavn" AS PROFITCENTER, anc."Knudebeskrivelse" FROM HIERARCHY_ANCESTORS ( SOURCE HIERARCHY ( SOURCE ( SELECT "Knude-ID" AS node_id, "ID for overordnet" AS parent_id, "Knudenavn", "Knudebeskrivelse" FROM "FRS_PRO244"."GAAA_FKO" ) CACHE FORCE ) START WHERE 1=1 -- 遍历所有节点作为起始点 ) anc WHERE anc.HIERARCHY_LEVEL = 2 ) h WHERE t.PROFITCENTER = h.PROFITCENTER;
如果需要使用表UDF实现,也可以用同样的关联逻辑,将表UDF的返回结果作为关联表,和更新表关联后赋值即可,不需要在SET子句中逐行调用函数。
内容的提问来源于stack exchange,提问作者Erik Lassen
相关产品推荐
相关产品推荐

