Sql 无法在HANA Studio中的过程中调用过程

Sql 无法在HANA Studio中的过程中调用过程,sql,stored-procedures,hana,hana-studio,Sql,Stored Procedures,Hana,Hana Studio,我正在尝试调用我之前在新过程中进行的过程。无论我怎么做,我都会在同一行中出错。 我最初的路线是: CALL "PAYROLLDBTEST"."ABS_GetEmployeeHistoryDetail"(:EmpID) 在此错误中,我得到了无效的函数或过程名称:ABS_GETEMPLOYEEHISTORYDETAILS: 然后我试着 调用payrolldtest/ABS\u GetEmployeeHistoryDetailEmpID 在这一点上,我得到了错误sql语法错误:附近的语法不正确: 所

我正在尝试调用我之前在新过程中进行的过程。无论我怎么做,我都会在同一行中出错。 我最初的路线是:

CALL "PAYROLLDBTEST"."ABS_GetEmployeeHistoryDetail"(:EmpID)
在此错误中,我得到了无效的函数或过程名称:ABS_GETEMPLOYEEHISTORYDETAILS:

然后我试着 调用payrolldtest/ABS\u GetEmployeeHistoryDetailEmpID 在这一点上,我得到了错误sql语法错误:附近的语法不正确:

所以请告诉我出了什么问题

编辑: 整个过程如下:

CREATE PROCEDURE "PAYROLLDBTEST".GetEmploymentHistoryFunction 
(IN EmpID integer, IN StartDate timestamp, IN EndDate timestamp,OUT RETURNVALUE   NVARCHAR) 
LANGUAGE SQLSCRIPT 
AS 

BEGIN 
SELECT *, DAYS_BETWEEN("FromDate", "ToDate") + 1 AS "DaysCount" 
 FROM (SELECT "Code", "Name", "U_LineID", "U_empID", "U_Status", 
        CASE 
            WHEN ("ToDate" < :StartDate) THEN NULL 
            WHEN ("FromDate" > :EndDate) THEN NULL 
            WHEN ("FromDate" < :StartDate AND ("ToDate" BETWEEN :StartDate AND :EndDate)) THEN :StartDate 
            WHEN ("FromDate" < :StartDate AND "ToDate" > :EndDate) THEN :StartDate 
            WHEN (("FromDate" BETWEEN :StartDate AND :EndDate) AND
             ("ToDate" BETWEEN :StartDate AND :EndDate)) THEN "FromDate" 
            WHEN (("FromDate" BETWEEN :StartDate AND :EndDate) AND "ToDate" > :EndDate) THEN "FromDate" 
            WHEN ("ToDate" IS NULL AND "FromDate" < :StartDate) THEN :StartDate 
            WHEN ("ToDate" IS NULL AND ("FromDate" BETWEEN :StartDate AND :EndDate)) THEN "FromDate" 
        END AS "FromDate", 
        CASE 
            WHEN ("ToDate" < :StartDate) THEN NULL 
            WHEN ("FromDate" > :EndDate) THEN NULL 
            WHEN ("FromDate" < :StartDate AND ("ToDate" BETWEEN :StartDate AND :EndDate)) THEN "ToDate" 
            WHEN (("FromDate" BETWEEN :StartDate AND :EndDate) AND
             ("ToDate" BETWEEN :StartDate AND :EndDate)) THEN "ToDate" 
            WHEN ("FromDate" < :StartDate AND "ToDate" > :EndDate) THEN :EndDate 
            WHEN (("FromDate" BETWEEN :StartDate AND :EndDate) AND "ToDate" > :EndDate) THEN :EndDate 
            WHEN ("ToDate" IS NULL AND "FromDate" < :StartDate) THEN :EndDate 
            WHEN ("ToDate" IS NULL AND ("FromDate" BETWEEN :StartDate AND :EndDate)) THEN :EndDate 
        END AS "ToDate", "U_Position", "U_Project", "U_Sponsorship" 
    FROM (
    --select * from ABS_GetEmployeeHistoryDetails WHERE ("EmpID" IN (:EmpID))
  --select * from "PAYROLLDBTEST"."ABS_GetEmployeeHistoryDetails" WHERE ("EmpID" IN (:EmpID))
  CALL "PAYROLLDBTEST"."ABS_GetEmployeeHistoryDetails"(:EmpID,:RETURNVALUE);

 ) InnerQuery
 ) OuterQuery
 WHERE ("FromDate" between :StartDate and :EndDate OR "ToDate" between :StartDate and    :EndDate);


END;

谢谢

应该从_SYS\u BIC架构调用过程,请尝试以下调用:

call "_SYS_BIC"."PAYROLLDBTEST/ABS_GetEmployeeHistoryDetail"(:EmpID)

首先,确保您的过程确实位于您在案例PAYROLLDBTEST中尝试调用的模式中

您可以通过查看HANA Studio中的目录来检查这一点—打开目录,然后打开模式PAYROLLDBTEST,然后打开文件夹过程。您的过程应位于此文件夹中。如果没有,请尝试刷新此文件夹。如果过程仍然不在其中,那么它肯定存储在另一个模式中

其次,确保使用正确数量的参数调用过程

您提到的过程似乎只有一个参数EmpID,它似乎是一个输入参数。您的过程的名称是GetEmployeeHistoryDetail,因此我假设您至少有一个输出参数作为第二个参数来获取员工历史的详细信息。如果是这种情况,您应该像这样调用过程,假设您在另一个过程中,并且希望在标量或表变量中使用内部过程的输出:

declare someOutputVariable bigint;
CALL "PAYROLLDBTEST"."ABS_GetEmployeeHistoryDetail" (:EmpID, :someOutputVariable);
或者,如果out参数是表变量。someTableVariable也可以直接作为外部过程的输出参数:

PROCEDURE "SOMESCHEMA"."yourProcedure" (
      in someInputParameter1 NVARCHAR(255),
      in someInputParameter2 BIGINT,
      out someOutputParameter1 BIGINT,
      out yourSubProcedureOutputParameter "SOMESCHEMA"."some_tabletype") 
   LANGUAGE SQLSCRIPT
   SQL SECURITY INVOKER AS
BEGIN
    // ... (other code logic)
    CALL "PAYROLLDBTEST"."ABS_GetEmployeeHistoryDetail" (:EmpID, :yourSubProcedureOutputParameter);
END;
无法在SELECT语句的FROM部分内执行调用

您的程序应如下所示:

CALL "PAYROLLDBTEST"."ABS_GetEmployeeHistoryDetails"(:EmpID,:TEMP);

SELECT fields
FROM (
  SELECT fields, case1, case2
  FROM ( SELECT * FROM :TEMP ) InnerQuery
) OuterQuery
WHERE (conditions);

仍然得到错误,这一次它说sql语法错误:附近的语法不正确。我试过了,但在同一行上给了我错误:SAP DBTech JDBC:[257]在2191:sql语法错误:附近的语法不正确。第34行第27列在位置2191,我已经在我的问题中添加了整个过程,请检查。这个问题与sql Server有任何关系吗?您已经添加了sql server标记,但我看不到连接。原始过程是在sql中进行的,因此在ITI中使用了标记和sql语法。如果是在sql中,您可能应该使用sql来标记问题。SQL是一种语言,SQL Server是一种恰好使用该语言变体的产品。许多其他产品也使用SQL,因此将您的问题标记为与SQL Server相关似乎令人困惑。很抱歉,我不知道,但已更正了它。@mark,您的问题解决了吗?我正在寻找动态调用过程。这意味着我在变量Ex:dyn_sp:=“MY_storage_PROC”中有一个过程名;如何从另一个过程调用dyn_sp:var1,:var2动态调用它@Daniell kullmann我正在寻找动态调用过程。这意味着我在变量Ex:dyn_sp:=“MY_storage_PROC”中有一个过程名;如何从另一个过程调用dyn_sp:var1,:var2动态调用它@程序员可以使用EXEC在varchar中执行SQL命令。但是,如果您想从调用存储过程中返回结果值,这可能行不通。我也需要返回这些值。有办法吗?非常感谢你的帮助!