Обновление таблицы из функции иерархии — SAP HANA

#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'