SAP DBTech JDBC:不支持特性:标量UDF不支持SQL语句



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

相关内容

  • 没有找到相关文章

最新更新