在 SAP HANA 的 SQLScript 开发中,有一种非常容易被忽略的情况。我们正在使用游标逐条处理一批业务数据,某条记录处理失败后,程序执行了ROLLBACK,希望撤销当前事务中的数据库修改,同时继续处理结果集中的下一条记录。然而,事务回滚之后,原本能够正常读取数据的游标突然失效,后续的FETCH无法再取得预期的记录。这种现象在批量订单处理、数据迁移、财务对账和接口消息处理等业务中尤其需要关注。问题并不一定出在FETCH语句本身,也不一定是原始查询的数据发生了变化,而是游标的有效性可能受到了事务边界的影响。SAP HANA 提供了Cursor Holdability机制,允许 SQLScript 开发人员在声明游标时,明确指定游标在事务提交或者事务回滚之后是否继续保持有效。这一机制涉及三个需要分别理解的概念,游标生命周期、数据库事务生命周期,以及查询结果集的生命周期。它们之间存在联系,但不能简单地认为事务结束就等于游标关闭,也不能认为游标在事务结束后仍然有效,就代表数据库中的所有数据都会保持不变。理解这些区别,是正确使用WITH HOLD、WITHOUT HOLD以及普通游标声明的关键。一、从事务边界理解游标的可保持性我们先建立一个具体的业务场景。SAP S/4HANA 的财务接口每天需要处理大量来自外部系统的付款记录。后台程序将待处理记录查询出来,依次执行数据校验、业务状态更新和日志记录。/
