在我的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有延迟,它知道更新可能需要时间,如果您的查询是异步的,那么您可能无法取回数据,所以请确保序列步骤处于同步状态。
这种特殊情况下的顺序变化:
- OUT outtab"。".data::模型。过程。错误"应该是架构记录而不是错误表
- 取过程中的时间戳
- 对表".data::models.prediction"应用锁定
- 插入后添加具有最近值的选择
- 如果时间戳与select record匹配,则一切正常
- 如果时间戳不匹配,则返回错误
- 使outtab成为新选择的记录
SAP HANA OData Service Definitions(XS Advanced)的官方文档指出,不可能使用序列在OData服务公开的表中创建条目:
如果不支持SQLScript中的IN/OUT表参数无法使用序列在公开的表中创建条目通过OData服务。但是,您可以使用XS JavaScript出口使用生成的值更新表。