我必须在存储过程的循环中处理记录,例如:
create or alter procedure process_waiting_records
as
declare v_id type of column my_table.id;
begin
for
select
t.id
from
my_table t
where
(t.status = 'WAITING_TO_PROCESS')
order by
t.created_at
into
:v_id
do
begin
execute procedure process_one_record(:v_id);
end
end ^
问题是当执行process_one_record()
失败(产生任何类型的异常)时,整个修改集将从调用代码中回滚。
目标是处理所有可能的记录,此时我并不关心是否无法处理某些记录,这些失败的记录无论如何都会记录在日志表中(使用自治事务)。
我正在考虑process_one_record()
在带有when any do (dummy code)
子句的自治事务块中调用存储过程。但是,我认为这行不通,因为该失败的事务不会被回滚,而是被提交(参考这个主题:Firebird 2.5 exception handling in automatic transaction)。
有人可以指出我如何解决这个问题的正确方向吗?