首页 > 解决方案 > 在oracle存储过程中将数据插入到多个表中

问题描述

我有五个表和 5 个表是链接的。

1) Rules_Group (GroupId-Primary Key)
2) Rules_Sub_Group (GroupId - 来自 Rules_Group 的外键)
3) Rules (SubGroupId - 来自 Rules_Sub_Group 的外键)
4) Rules_Expression (RulesId - 来自规则的外键)
5) Rules_Expression_Eval (RulesId - 外键来自规则)

如何编写一个存储过程来一次插入/更新所有记录,如果有任何失败,我想回滚事务。

做这个的最好方式是什么?

标签: oraclestored-procedures

解决方案


如何编写一个存储过程来一次插入/更新所有记录,如果有任何失败,我想回滚事务。

一种常见的方法是建立一个保存点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;

根据您的表的方式和源数据的方式,您还可以组合五 (5) 条语句中的一些INSERT语句,使用INSERT ALL.


推荐阅读