我有五个表,五个表被链接。
1)Rules_Group(GroupId-主键)
2)Rules_Sub_Group(GroupId-Rules_Group的外键)
3)规则(SubGroupId-Rules_Sub_Group的外键)
4)Rules_Expression(RulesId-规则中的外键)
5)Rules_Expression_Eval(RulesId-规则中的外键)
如何编写存储过程以一次全部插入/更新记录,如果发生任何故障,我想回滚事务。
最好的方法是什么?
答案 0 :(得分:4)
如何编写存储过程以一次全部插入/更新记录,如果发生任何故障,我想回滚事务。
一种常见的方法是建立一个SAVEPOINT
,如果发生错误,则建立一个ROLLBACK
到保存点。如果愿意,您可以选择继续处理下一条记录。它还保留了事务,使您仅可以在最后处理一个COMMIT
(这出于好几个原因可能是有争议的,而不是您要问的问题)。
这是一般想法:
FOR r IN ( ... select your source data, or maybe load it from a file ... ) LOOP
BEGIN
SAVEPOINT myproc_pre_insert;
INSERT INTO rules_group ...;
INSERT INTO rules_sub_group ...;
INSERT INTO rules ...;
INSERT INTO rules_expression ...;
INSERT INTO rules_expression_eval ...;
EXCEPTION
WHEN others THEN
ROLLBACK TO myproc_pre_insert;
... log error, possibly ...
... either (A) abort the process ...
RAISE;
... or (B) continue with the next record
CONTINUE;
END;
END LOOP;
COMMIT;
根据表的方式和源数据的方式,还可以使用INSERT
合并五(5)条INSERT ALL
语句中的一部分。