在具有 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
。
我尝试使用 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
。