如何将值插入到FUNCTION' S表中

时间:2018-03-05 09:07:47

标签: function hana-sql-script

我的职能就在这里;

CREATE FUNCTION "HS_getMaasHesapla"(EmpId INT,MaasTuru VARCHAR(1),Donem VARCHAR(50),SablonCode VARCHAR(50),
       Maas DECIMAL(18,6),Brut DECIMAL(18,6),Pek DECIMAL(18,6),NetEkKazanc DECIMAL(18,6),BrutEkKazanc DECIMAL(18,6), 
       EkKesinti DECIMAL(18,6),DvrGvMatrah DECIMAL(18,6),SonBrutMaas DECIMAL(18,6),HesaplananMatrah DECIMAL(18,6),
       IzinTutar DECIMAL(18,6),MesaiTutar DECIMAL(18,6),Agi DECIMAL(18,6),IsBes VARCHAR(1),IsIcra VARCHAR(1),
       donembasi DATE,donemsonu DATE)


RETURNS  TABLE
(
    EmpId INT, GVMatrah DECIMAL(18,6),Brut DECIMAL(18,6),SGKIsv DECIMAL(18,6),IszCal DECIMAL(18,6),
    IszIsv DECIMAL(18,6),SGKCal decimal(18,6),GV decimal(18,6),DV decimal(18,6),Net decimal(18,6),
    EkKazanc decimal(18,6),Pek decimal(18,6),IzinTutar decimal(18,6),Bes decimal(18,6),Icra decimal(18,6),
    Odenen decimal(18,6),Maliyet decimal(18,6),EkKesinti decimal(18,6),Mesai decimal(18,6)
    ,IcraOran decimal(18,6),DosyaNumarasi varchar(50)
)
LANGUAGE SQLSCRIPT
SQL SECURITY DEFINER AS
BEGIN
DV := "HS_DVTutar"(:Brut, :donembasi, :donemsonu);
IF (:MaasTuru = 'B') THEN Net := (:Brut) - :SGKCal - :IszCal - :GV - :DV;
EkKazanc := :BrutEkKazanc;
Pek := :Brut + :Pek;
ELSE Net := (:Brut) - :SGKCal - :IszCal - :GV - :DV;
EkKazanc := :BrutEkKazanc + :NetEkKazanc;
Pek := :Brut;
END IF;
Net := round(:Net, 2);
IF (:Icra > 0) THEN Icra := (:Net * :IcraOran) / 100.00;
END IF;
Odenen := :Net + :Agi - :Icra - :Bes - :EkKesinti;
Maliyet := :Brut + :SGKIsv + :IszIsv;
INSERT INTO TABLE("EmpId" , "GVMatrah", "Brut", "SGKIsv", "IszCal", "IszIsv", "SGKCal", "GV", "DV", "Net", "EkKazanc", "Pek", "IzinTutar", "Bes", "Icra", "Odenen", "Maliyet", "EkKesinti", "Mesai", "IcraOran", "DosyaNumarasi") VALUES (round("GvMatrah", 2), round(:Brut, 2), round(:SGKIsv, 2), round(:IszCal, 2), round(:IszIsv, 2), round(:SGKCal, 2), round(:GV, 2), round(:DV, 2), round(:Net, 2), round(:EkKazanc, 2), round(:Pek, 2), round(:IzinTutar, 2), round(:Bes, 2), round(:Icra, 2), round(:Odenen, 2), round(:Maliyet, 2), round(:EkKesinti, 2), round(:MesaiTutar, 2), round(:IcraOran, 2), round(:DosyaNumarasi, 2));
RETURN;
END;

但我的错误在这里:

  

无法在架构SBODEMOTR中找到表/视图表:第79行第13行(位于pos 3861)

另一方面我不能使用Select; 你能告诉我怎么做吗?

2 个答案:

答案 0 :(得分:0)

我认为您的消息意味着您需要在SBODEMOTR架构中创建一个名为TABLE的表,以便能够在您的函数的插入中使用。

此外,根据文件:

  

CREATE FUNCTION语句创建的只读函数   没有副作用。 DDL或DML语句(INSERT,UPDATE,   函数体中允许使用和DELETE)。还有其他功能或   必须读取从函数体中选择/调用的过程   仅

[https://help.sap.com/viewer/4fe29514fd584807ac9f2a04f6754767/2.0.02/en-US/20d42e77751910149f0ff6b879b1290f.html][doc链接]

相反,您的功能可能/应该如下所示:

DROP   FUNCTION MYFUNCTION;
CREATE FUNCTION MYFUNCTION (Val1 INT, Val2 INT, Val3 INT)
RETURNS TABLE (col1 INT, col2 INT) LANGUAGE SQLSCRIPT AS
BEGIN
    IF :Val1 > :Val2 THEN
        Val3 := 2  * :Val3;
    ELSE
        Val3 := -1 * :Val3;
    END IF;
    RETURN SELECT :Val1 AS col1, :Val2 * :Val3 AS col2 FROM DUMMY;
END;

SELECT * FROM MYFUNCTION(2,3,2);

顺便说一句,你当前的代码缺少一些变量声明是有效的。

答案 1 :(得分:0)

Merhaba @ J.Doe

您的函数返回一个TABLE。 " TABLE"不是您尝试返回的表格对象的名称

在您的功能代码中,只需一起使用RETURN和SELECT语句

这是我使用的示例函数

CREATE FUNCTION "DummySelect"(article int)
RETURNS  TABLE
(
    Id INT, Type varchar(10)
)
LANGUAGE SQLSCRIPT
SQL SECURITY DEFINER AS
BEGIN

declare myId int;
declare myType varchar(10);

select ARTICLE, "TYPE" 
    into "MYID", "MYTYPE" 
    from Article_Types 
    where "TYPE" = 'AA';

RETURN (select :myId, :myType from dummy);

END;

您在RETURN命令中看到,我返回SELECT的结果集,该结果集具有与TABLE定义声明的完全相同的类型

只需使用SELECT返回

,而不是INSERT到返回表中

我希望它有所帮助