我是HANA Studio的新人,所以请原谅我。
我得到一个错误,而在SAP HANA工作室创建功能。下面是我的函数:
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 ms 807µs。SAP DBTech JDBC: [257] (at 576): sql syntax error:语法错误"RETURNS"附近:第23行第1栏(在位置576处)"
HANA中有两种函数:表函数和标量函数。
根据SAP HANA SQL脚本参考(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
s(见https://scn.sap.com/thread/3861611)