SAP DBTech JDBC: функция не поддерживается: Scalar UDF не поддерживает оператор SQL
Я новичок в HANA Studio, поэтому, пожалуйста, извините.
Я получаю сообщение об ошибке при создании функции в SAP HANA Studio. Вот моя функция:
CREATE FUNCTION "PAYROLLDBTEST".GetAbsenteeismDays
(
-- Add the parameters for the function here
EmpID integer,
StartDate Datetime,
EndDate Datetime
)
RETURNS AbsDays float
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER
AS
AbsDays float;
BEGIN
(SELECT SUM(DATEDIFF(DAY, "fromDate", "toDate") + 1) AS AbsentDays into AbsDays
FROM HEM1
WHERE "empID" = :EmpID AND "fromDate" BETWEEN :StartDate AND :EndDate
AND "toDate" BETWEEN :StartDate AND :EndDate
);
RETURNS AbsDays;
ошибка:
"Не удалось выполнить" CREATE FUNCTION "PAYROLLDBTEST".GetAbsenteeismDays ( - Добавить параметры для функции здесь...'за 2 мс 807 мкс. SAP DBTech JDBC: [257] (на 576): ошибка синтаксиса sql: неверный синтаксис возле "ВОЗВРАЩАЕТСЯ": строка 23 цв 1 (поз 576) "
2 ответа
В HANA есть два типа функций: табличные функции и скалярные функции.
Согласно Справочнику по сценариям SQL SAP HANA (SPS 07) использование DDL и DML в табличной функции не допускается. Скалярные функции не поддерживают никаких SQL-операторов.
Вы возвращаете только значение, а не таблицу, поэтому вы пытаетесь создать скалярную функцию. Упомянутый вами пример выполнения оператора Select внутри скалярной функции не будет работать. Но вместо создания функции вы также можете легко создать процедуру, содержащую те же функции (если вам действительно нужно получить только одно число с плавающей запятой).
CREATE PROCEDURE "PAYROLLDBTEST"."GetAbsenteeismDays" (
in EmpID integer,
in StartDate Datetime,
in EndDate Datetime,
out AbsentDays float )
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER
-- DEFAULT SCHEMA <Schema>
READS SQL DATA AS
BEGIN
SELECT SUM(DATEDIFF(DAY, "fromDate", "toDate") + 1) into AbsentDays
FROM HEM1
WHERE "empID" = :EmpID
AND "fromDate" BETWEEN :StartDate AND :EndDate
AND "toDate" BETWEEN :StartDate AND :EndDate
END;
Недостатком решения @hoffman является то, что вы не можете использовать PROCEDURE
в проекции (как WHERE
-часть запроса):
SELECT * FROM myTable WHERE "myProcedure"('param') > 5;
дает
cannot use procedure or table function in select projection column
Начиная с HANA 11, скалярные функции поддерживают SQL, поэтому нет необходимости использовать PROCEDURE
больше здесь (см. https://scn.sap.com/thread/3861611)
счастливый