#sql #user-defined-functions #hierarchy #hana
Вопрос:
Боролся с этим — надеюсь, кто-нибудь сможет помочь…
Я создал скалярную пользовательскую функцию (UDF) в SAP HANA Studio, которая должна возвращать «Knudebeskrivelse» (описание узла) из иерархии на основе входных PROFITCENTER
данных и HIERARCHY_LEVEL
:
CREATE OR REPLACE FUNCTION GET_KNUDEBESKRIVELSE_ON_REQUESTED_LEVEL
(IN PROFITCENTER NVARCHAR (40)
,IN HIERARCHY_LEVEL_INPUT INT)
returns KNUDEBESKRIVELSE NVARCHAR (40)
AS
BEGIN
DECLARE KNUDEBESKRIVELSE NVARCHAR(40);
SELECT
"Knudebeskrivelse" INTO KNUDEBESKRIVELSE
FROM HIERARCHY_ANCESTORS (
SOURCE HIERARCHY (
SOURCE (
select "Knude-ID" AS node_id, "ID for overordnet" as parent_id, * FROM "FRS_PRO244"."GAAA_FKO"
)
CACHE FORCE
)
START WHERE "Knudenavn" = PROFITCENTER
)
WHERE HIERARCHY_LEVEL = HIERARCHY_LEVEL_INPUT
;
END
;
Используя эту функцию, я хочу обновить поле MYNDIGHED
в таблице AP_MYNDIGHED
, взяв значение PROFITCENTER
из AP_MYNDIGHED
, и HIERARCHY_LEVEL
(до сих пор я просто жестко закодировал » 2 » — будет изменено позже), как показано ниже:
UPDATE FRS_PRO244.AP_MYNDIGHED
SET MYNDIGHED = "FRS_PRO244"."GET_KNUDEBESKRIVELSE_ON_REQUESTED_LEVEL"(AP_MYNDIGHED.PROFITCENTER, 2)
Функция создана и запускается без сообщений об ошибках, но поле MYNDIGHED
не обновляется — или, скорее, оно обнуляется…
Я подозреваю, что проблемы связаны с тем, что возвращаемое значение равно нулю из-за какой-то ошибки в функции, но я не уверен, как это проверить и устранить.
Я попытался создать подобную таблицу UDF, которая возвращает требуемое значение просто отлично… Проблема здесь в том, что я не знаю, как использовать результат функции таблицы в операторе set.
В любом случае, вероятно, какая — то основная ошибка (я не очень разбираюсь в этом) — надеюсь, кто-нибудь сможет указать мне правильное направление.
Спасибо!
Ответ №1:
Что ж, в конце концов, я заставил его работать — этот функциональный код делает свое дело:
CREATE OR REPLACE FUNCTION GET_KNUDEBESKRIVELSE_ON_REQUESTED_LEVEL_SCALAR
(IN PROFITCENTER NVARCHAR (40)
,IN HIERARCHY_LEVEL_INPUT INT)
returns KNUDEBESKRIVELSE_OUT NVARCHAR(40)
AS
BEGIN
DECLARE KNUDEBESKRIVELSE NVARCHAR(40);
SELECT KNUDEBESKRIVELSE INTO KNUDEBESKRIVELSE_OUT
FROM HIERARCHY_ANCESTORS (
SOURCE HIERARCHY (
SOURCE (
select "Knude-ID" AS node_id, "ID for overordnet" as parent_id, "Knudebeskrivelse" AS KNUDEBESKRIVELSE, "Knudenavn" as KNUDENAVN FROM "FRS_PRO244"."GAAA_FKO"
)
CACHE FORCE
)
START WHERE KNUDENAVN = PROFITCENTER
)
WHERE HIERARCHY_LEVEL = HIERARCHY_LEVEL_INPUT
;
END;
Похоже, я мог внести некоторую путаницу в код с наименованием переменной 'KNUDEBESKRIVELSE'
…