oracle - 在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 - 外键来自规则)
如何编写一个存储过程来一次插入/更新所有记录,如果有任何失败,我想回滚事务。
做这个的最好方式是什么?
解决方案
如何编写一个存储过程来一次插入/更新所有记录,如果有任何失败,我想回滚事务。
一种常见的方法是建立一个保存点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
.
推荐阅读
- python-3.x - 有条件地将变量名连接到 Python 中的新变量中
- javascript - 如何从过滤的 json 数组中获取值
- api - IBM Cloud API:如何获取 IBM ID/用户的 IAM-id?
- java - 无法从 START_ARRAY 令牌中反序列化 POJO 实例
- jquery - SearchPane 列显示的数据表问题
- ios - 是否存在某种方式来获取来自 json 或 swift 文件的测试数据,仅用于预览提供者?
- dialogflow-es - 传递函数触发器时出错。参考错误:未定义客户端 ID
- python - 为什么 SocketIO 和 SSLify 不能一起工作?
- c# - 在 c# wpf 中键绑定到按钮元素
- azure - 使用具有 azure 功能的 azure service bus 进行 ERP 订单导入的最佳方法