SAP DBTech JDBC:不支持的功能:标量UDF不支持SQL语句

时间:2014-06-06 06:35:33

标签: sql-server hana hana-studio

我是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 ms807μs内。   SAP DBTech JDBC:[257](at 576):sql语法错误:语法不正确   “RETURNS”附近:第23行第1栏(位于第576号)“

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

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

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

给出

cannot use procedure or table function in select projection column

来自HANA 11的标量函数执行支持SQL,因此不再需要PROCEDURE这里使用<script> var id = 1; $( "#new-projects" ).load( "GetDataPeople.php?id=" + id ); </script>

快乐