在oracle存储过程中将数据插入到多个表中

Posted

技术标签:

【中文标题】在oracle存储过程中将数据插入到多个表中【英文标题】:Insert Data into multiple tables in oracle stored procedure 【发布时间】:2019-07-11 12:56:14 【问题描述】:

我有 5 个表,5 个表是链接的。

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

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

最好的方法是什么?

【问题讨论】:

你试过什么?存储过程的签名是什么,即它的参数? 【参考方案1】:

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

一种常见的方法是建立一个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 ALL 组合五 (5) 个 INSERT 语句中的一些语句。

【讨论】:

以上是关于在oracle存储过程中将数据插入到多个表中的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle 中将结果集插入到表中

oracle 的存储过程中 动态的创建一张表 然后插入一个变量到这个表中,表能动态的创建但是变量不能插入进去

在 Oracle SQL 中使用存储过程将数据插入表中

Oracle:创建存储过程以将另一个存储过程的结果插入表中

并行执行 oracle PL/SQL [重复]

oracle存储过程效率问题,处理1500w的数据插入