将数据插入到Oracle存储过程中的多个表中

时间:2019-07-11 12:56:14

标签: oracle stored-procedures

我有五个表,五个表被链接。

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-规则中的外键)

如何编写存储过程以一次全部插入/更新记录,如果发生任何故障,我想回滚事务。

最好的方法是什么?

1 个答案:

答案 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语句中的一部分。