如何在事务之间的 postgresql 中保存 table 进度?
How to save table progress in postgresql between transaction?
表正在循环更新,但如果错误出现在 table 之一而不是事务失败并且所有 tables 更新的数据都消失了所以给我提供解决方案,其中每次 table是更新,它的进度可以保存。
d0
$$
declare g record;
declare tablename varchar(50);
BEGIN
--fetching tablename from catalog.table
for g in execute formate ('select table_name from catalog.table');
loop
tablename= lower(g.tablename);
--passing tablename to function for some execution
execute'select function('''||tablename||''')';
end loop;
end;
$$
如果您捕获错误,交易将不会失败。
BEGIN
execute your query
EXCEPTION WHEN unique_violation OR foreign_key_violation OR ... THEN
END;
当一个函数或代码块被执行时,总是已经有一个使用 BEGIN 显式创建或自动创建的事务。异常块的 BEGIN 充当事务中的 SAVEPOINT。当错误被 EXCEPTION 部分捕获时,只有 BEGIN 之后的工作丢失,因为它回滚到保存点。
当您让错误从函数中逃逸时,整个事务的回滚就完成了。
有关详细信息,请参阅 manual。
顺便说一句。 postgresql 9.1 没有被维护你应该考虑升级。
表正在循环更新,但如果错误出现在 table 之一而不是事务失败并且所有 tables 更新的数据都消失了所以给我提供解决方案,其中每次 table是更新,它的进度可以保存。
d0
$$
declare g record;
declare tablename varchar(50);
BEGIN
--fetching tablename from catalog.table
for g in execute formate ('select table_name from catalog.table');
loop
tablename= lower(g.tablename);
--passing tablename to function for some execution
execute'select function('''||tablename||''')';
end loop;
end;
$$
如果您捕获错误,交易将不会失败。
BEGIN
execute your query
EXCEPTION WHEN unique_violation OR foreign_key_violation OR ... THEN
END;
当一个函数或代码块被执行时,总是已经有一个使用 BEGIN 显式创建或自动创建的事务。异常块的 BEGIN 充当事务中的 SAVEPOINT。当错误被 EXCEPTION 部分捕获时,只有 BEGIN 之后的工作丢失,因为它回滚到保存点。
当您让错误从函数中逃逸时,整个事务的回滚就完成了。
有关详细信息,请参阅 manual。
顺便说一句。 postgresql 9.1 没有被维护你应该考虑升级。