2016-07-19 51 views
0

我是sap hana世界的新手。我试图使用存储过程来更新信息。我想发送一个自定义表格类型的字段名称,字段值和行ID。 我创造了这个类型:存储过程中的自定义表类型sap hana

CREATE TYPE t_field AS TABLE (
    ID INTEGER, 
    FLD VARCHAR(100), 
    VAL VARCHAR(100)); 

而且我用它在此过程中:

PROCEDURE "_SYS_BIC"."Match.procedures::updateAnag" (
    in tfield tt_field, 
    out error tt_error 
) 

LANGUAGE SQLSCRIPT 
SQL SECURITY INVOKER 
DEFAULT SCHEMA "_SYS_BIC" 
AS 

BEGIN 

    declare _id integer; 
    declare _field varchar(100); 
    declare _value varchar(100); 

    select ID, F_NAME, F_VALUE 
    into _id, _field, _value 
    from :tfield; 

    IF(_field = '' OR _value = '') THEN 
     error = SELECT 400 AS http_status_code, 
       'empty field' as error_message, 
        'All fields must be filled' as detail from dummy; 
    ELSE 

    IF (_field = 'name') THEN 
     UPDATE "_SYS_BIC"."TEST_TABLE" 
     SET NAME = _value 
     WHERE ID = _id; 
    END IF; 

    IF (_field = 'surname') THEN 
     UPDATE "_SYS_BIC"."TEST_TABLE" 
     SET SURNAME = _value 
     WHERE ID = _id; 
    END IF; 

    END IF; 

END; 

但是,当我尝试激活代码,日食返回我这个错误: “SAP-UI核心.js:159 2016-07-19 17:45:47.751550发生以下问题:HTTP请求失败400,错误请求,请求包含实体' anagType'中不存在的属性。 - '

有人可以帮助我解决它或让我更好的方法来做到这一点?

+1

好吧,我想让你想要更新程序的'灵活',但这是一个笨拙的方式来做到这一点。使您的信息数据块显式化并使用列的1:1映射执行直接更新。可以手动检查空字段,也可以在表上将其保留为NOT NULL约束。 –

+0

感谢您的帮助。在这篇文章中,最让我感兴趣的是理解为什么该过程不适用于自定义表格。这种方法是一个孤立的案例。 – Shiroga

回答

1

好了,从一个SQLSCript码点,我想在这里说一个问题是,当你使用变量(如_value或_id)必须在他们面前冒号:

CREATE PROCEDURE "_SYS_BIC"."Match.procedures::updateAnag" (
    in tfield tt_field, 
    out error tt_error 
) 

LANGUAGE SQLSCRIPT 
SQL SECURITY INVOKER 
DEFAULT SCHEMA "_SYS_BIC" 
AS 

BEGIN 

    declare _id integer; 
    declare _field varchar(100); 
    declare _value varchar(100); 

    select ID, F_NAME, F_VALUE 
    into _id, _field, _value 
    from :tfield; 

    IF(:_field = '' OR _:value = '') THEN 
     error = SELECT 400 AS http_status_code, 
       'empty field' as error_message, 
        'All fields must be filled' as detail from dummy; 
    ELSE 

    IF (:_field = 'name') THEN 
     UPDATE "_SYS_BIC"."TEST_TABLE" 
     SET NAME = :_value 
     WHERE ID = :_id; 
    END IF; 

    IF (:_field = 'surname') THEN 
     UPDATE "_SYS_BIC"."TEST_TABLE" 
     SET SURNAME = :_value 
     WHERE ID = :_id; 
    END IF; 

    END IF; 

END; 

另一个问题是,您不要在IF语句的第二个分支中初始化表变量错误。

虽然不太确定,但所有这些与您的错误信息有关。您可能需要先自行调用并测试该过程,然后再查看为什么与xsjs页面的连接无法正常工作。

+0

我不使用xsjs页面,我从.xsodata调用此过程。我会尝试这个解决方案。谢谢! – Shiroga