1

我是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;

错误 :

“无法在 2 ms 807 µs 内执行‘CREATE FUNCTION‘PAYROLLDBTEST’.GetAbsenteeismDays (--在此处添加函数的参数 ...’。SAP DBTech JDBC: [257] (at 576): sql 语法错误: 语法不正确“返回”附近:第 23 列第 1 行(在 pos 576)“

4

2 回答 2

1

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;
于 2014-06-06T12:17:35.243 回答
0

@hoffman解决方案的缺点是您不能PROCEDURE在投影中使用 a (例如WHERE查询的 - 部分):

SELECT * FROM myTable WHERE "myProcedure"('param') > 5;

cannot use procedure or table function in select projection column

从 HANA 11 开始,标量函数确实支持 SQL,因此这里不再需要使用PROCEDUREs (请参阅https://scn.sap.com/thread/3861611

快乐的

于 2016-07-16T13:39:01.910 回答