невозможно вызвать процедуру внутри процедуры в HANA Studio

Я пытаюсь вызвать процедуру, которую я сделал ранее, в новой процедуре. Независимо от того, что я пытаюсь, я получаю ошибку в той же строке. Моя первоначальная строка была:

CALL "PAYROLLDBTEST"."ABS_GetEmployeeHistoryDetail"(:EmpID)

при этом я получил ошибку «недопустимое имя функции или процедуры: ABS_GETEMPLOYEEHISTORYDETAILS:»

затем я попробовал CALL "PAYROLLDBTEST / ABS_GetEmployeeHistoryDetail" (EmpID) на этом. Я получил ошибку "Ошибка синтаксиса 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;

Спасибо


person mark    schedule 09.06.2014    source источник
comment
Связан ли этот вопрос каким-либо образом с SQL Server? Вы добавили тег sql-server, но я не вижу связи.   -  person Andriy M    schedule 11.06.2014
comment
Исходная процедура была в SQL, поэтому в ней используются теги, а также синтаксис SQL   -  person mark    schedule 11.06.2014
comment
Если это было в SQL, вам, вероятно, следует вместо этого пометить вопрос sql. SQL - это язык, SQL Server - это продукт, который использует (разновидность) этого языка. Многие другие продукты также используют SQL, поэтому пометка вашего вопроса как относящаяся именно к SQL Server может сбивать с толку.   -  person Andriy M    schedule 11.06.2014
comment
Извините за то, что не знал, но исправил.   -  person mark    schedule 11.06.2014
comment
@mark, у тебя это сработало? Я ищу динамический вызов процедуры. Это означает, что у меня есть имя процедуры в переменной (например, dyn_sp: = 'MY_STORED_PROC';) как мне вызвать это динамически из другой процедуры (CALL dyn_sp (: var1,: var2);   -  person programmer    schedule 16.03.2016


Ответы (3)


Прежде всего, убедитесь, что ваша процедура действительно расположена в схеме, которую вы пытаетесь вызвать (в вашем случае PAYROLLDBTEST).

Вы можете проверить это, заглянув в Каталог в HANA Studio - откройте Каталог, затем свою схему PAYROLLDBTEST, а затем папку Процедуры. Ваша процедура должна находиться в этой папке. Если нет, попробуйте обновить эту папку. Если процедуры все еще нет, она определенно хранится в другой схеме.

Во-вторых, убедитесь, что вы вызываете процедуру с правильным количеством параметров.

У вашей упомянутой процедуры, похоже, есть только один параметр, EmpID, который, похоже, является входным параметром. Имя вашей процедуры - GetEmployeeHistoryDetail, поэтому я предполагаю, что у вас есть по крайней мере один выходной параметр в качестве второго параметра (для получения подробностей истории сотрудников). В этом случае вы должны вызвать такую ​​процедуру (при условии, что вы находитесь внутри другой процедуры и хотите использовать вывод внутренней процедуры в скалярной или табличной переменной):

declare someOutputVariable bigint;
CALL "PAYROLLDBTEST"."ABS_GetEmployeeHistoryDetail" (:EmpID, :someOutputVariable);

Или, если ваш выходной параметр является табличной переменной. 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;
person hoffman    schedule 09.06.2014
comment
Я пробовал это, но дал мне ошибку в той же строке: SAP DBTech JDBC: [257] (на 2191): синтаксическая ошибка sql: неправильный синтаксис рядом.: Строка 34, столбец 27 (на позиции 2191) Я добавил всю процедуру в свой вопрос пожалуйста, проверьте. - person mark; 11.06.2014

Процедуры должны вызываться из схемы _SYS_BIC, попробуйте следующий вызов:

call "_SYS_BIC"."PAYROLLDBTEST/ABS_GetEmployeeHistoryDetail"(:EmpID)
person Kirill K.    schedule 09.06.2014
comment
все еще возникает ошибка, на этот раз он говорит об ошибке синтаксиса sql: рядом неправильный синтаксис. - person mark; 09.06.2014

Вы не можете сделать CALL внутри FROM части оператора SELECT.

Ваша процедура должна работать так:

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

SELECT fields
FROM (
  SELECT fields, case1, case2
  FROM ( SELECT * FROM :TEMP ) InnerQuery
) OuterQuery
WHERE (conditions);
person daniel kullmann    schedule 17.03.2015
comment
@danierl kullmann Я ищу динамический вызов процедуры. Это означает, что у меня есть имя процедуры в переменной (например, dyn_sp: = 'MY_STORED_PROC';) как мне вызвать это динамически из другой процедуры (CALL dyn_sp (: var1,: var2); - person programmer; 16.03.2016
comment
@programmer Вы можете использовать EXEC для выполнения команды SQL в varchar. Но если вы хотите вернуть значения результатов после вызова хранимой процедуры, это, вероятно, не сработает. - person daniel kullmann; 17.03.2016
comment
Мне тоже нужно вернуть ценности. Есть способ? Очень признателен за вашу помощь! - person programmer; 17.03.2016