在具有 return 值的执行块中执行时,插入不会持久化

Insert isn't persisted when executing in execute block with return values

我尝试使用 execute block 和 return 插入 ID 将两个值插入我的数据库。

execute block returns (id integer)
as begin
  insert into test (name) values ('test1') returning id into :id;
  suspend;
  insert into test (name) values ('test2') returning id into :id;
  suspend;
end;

如果我不调用 fetch|fetchAll 方法,则插入不会保存在数据库中。

我无法在执行多次读取结果集的查询后调用 fetchAll。 但是如果我在那里调用,插入是持久的,我可以获得 returned 值。

您必须获取执行块生成的所有行,才能执行这些语句。 execute block 是一个匿名的 'stored' 过程,suspend 语句使其成为“可选择的”。

执行时,Firebird 会完成 suspend 语句的工作,等待客户端获取该行,然后继续执行下一条语句,直到遇到另一个 suspend 语句。

如果一行没有被客户端获取并且语句被关闭/释放,那么Firebird将回滚所有更改直到之前的suspend(或者存储过程开始/execute block如果之前没有暂停)。

换句话说,execute block 需要检索行才能产生任何持久效果。

否则,最好单独执行插入,而不使用 execute block