HANA OData创建过程-我的新ID在哪里



在我的UI5应用程序中,我有一个项目列表。我通过弹出窗口创建了一个新项目(输入一些详细信息并单击"确定")。使用新实体的JSON数据,然后在OData模型上调用"create"。OData实体(如我的xsodata服务中所定义的)使用存储的proc来创建数据库记录,并使用序列来生成下一个ID。到目前为止,一切都很好。记录被创建,并且我的成功回调被执行。然而,我现在需要的是在我的响应负载中有新记录的ID,但我无法获得它

// Update the model and add our new forecast
    this.getView().getModel().create('/Forecasts', oData, {
        success : jQuery.proxy(function(mResponse) {
            // nav to newly created Forecast
            this.getRouter().navTo("forecast", {
                forecastId: mResponse.ID, // EMPTY!
                tab: "data"
            }, false);
        }, this),
        error : jQuery.proxy(function(mResponse) {
            this.showErrorAlert("Problem creating new forecast");
        }, this)
    });

mResponse.ID始终为空。我想不应该。ID被定义为实体预测中的一个键。

@Catalog.tableType: #ROW
entity forecast {
    key ID: IdType;
    NAME: NameType;
    CREATED: UTCDateTime;
    USER: UsernameType;
    EFFECTIVE: LocalDate;
    DAYS: Integer;  
};

xsodata服务(删除了模式和命名空间引用):

service {
    // Forecasts
    "<namesapce>.data::models.forecast" as "Forecasts" 
    create using "<namesapce>.procedures::createForecast";
}

这是执行插入的存储过程:

PROCEDURE "<schema>"."<namespace>.procedures::createForecast" ( 
    IN intab "<schema>"."<namespace>.data::models.procedures.forecast",
    OUT outtab "<schema>"."<namespace>.data::models.procedures.errors"
) 
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER
AS
-- DEFAULT SCHEMA <schema>
-- READS SQL DATA AS
BEGIN
    DECLARE lv_name string;
    DECLARE lv_days integer;
    SELECT NAME, DAYS INTO lv_name, lv_days FROM :intab;
    -- Now validate and insert
    IF :lv_name = '' THEN
        outtab = SELECT 500 AS http_status_code,
                    'Empty Forecast name' AS error_message,
                    'The Forecast name cannot be empty' AS detail FROM dummy;
    ELSEIF :lv_days = 0 THEN
        outtab = SELECT 500 AS http_status_code,
                    'Empty Forecast days' AS error_message,
                    'The Forecast days cannot be empty' AS detail FROM dummy;
    ELSE
        -- Perform the INSERT
        INSERT INTO "<namespace>.data::models.forecast"
        VALUES ("<namespace>.data::forecast".NEXTVAL, 
                lv_name,
                CURRENT_TIMESTAMP,
                CURRENT_USER,
                CURRENT_DATE,
                lv_days);
    END IF;
END;

如何将NEXTVAL值(现在为CURRVAL)获取到响应有效负载中,以便在模型的创建函数的成功回调中访问它?我试过多个out表,但总是遇到问题。肯定有一种简单的方法可以做到这一点吗?插入记录的密钥至关重要。我不想在客户端创建ID,因为它不准确——我需要从INSERT返回它。

HANA Odata服务的POST请求如果成功,将在响应中返回创建对象的数据,状态为201。因此,从响应中,您可以获得新插入数据的ID。

当我们实现事务时,我们需要确保任何事务都能正确运行。我们首先进行更新,然后读取记录。如果我们正确地读取了我们更新的记录,那么这意味着它在后端进行了更新。当我们更新和读取时,我们应该锁定表,这样就不会出现不一致。如果我们不能阅读,那么更新就不会发生。同样在内部,DB有延迟,它知道更新可能需要时间,如果您的查询是异步的,那么您可能无法取回数据,所以请确保序列步骤处于同步状态。

这种特殊情况下的顺序变化:

  1. OUT outtab"。".data::模型。过程。错误"应该是架构记录而不是错误表
  2. 取过程中的时间戳
  3. 对表".data::models.prediction"应用锁定
  4. 插入后添加具有最近值的选择
  5. 如果时间戳与select record匹配,则一切正常
  6. 如果时间戳不匹配,则返回错误
  7. 使outtab成为新选择的记录

SAP HANA OData Service Definitions(XS Advanced)的官方文档指出,不可能使用序列在OData服务公开的表中创建条目:

如果不支持SQLScript中的IN/OUT表参数无法使用序列在公开的表中创建条目通过OData服务。但是,您可以使用XS JavaScript出口使用生成的值更新表。

最新更新