在插入新行之前解析外键

时间:2011-07-06 23:06:57

标签: oracle plsql

我有一个原始表用作一种缓冲区,其中定期插入新数据(平均每次约5,000分钟插入~20,000行)。然后是一个存储的PL / SQL程序,它读取此原始表并将信息插入数据库的不同表中。
遗憾的是,我无法从存储在原始表中的行在目标表中直接批量插入,因为部分列(20个中的10个)是目标表中的外键。这意味着在执行插入操作之前,我必须解析所有外键ID,然后使用它们在目标表中插入新行。
而且,外键表中的元素不能存在,因此需要将其插入外键表中,然后将其id作为外键id。

我要使用的解决方案是使用以下存储过程:
 1)对于与目标表中的外键对应的原始表的每一列,我选择列的不同值,对于每一列,我选择外表中的id,如果是不存在我插入它重新调整相对id;
 2)我写出一个空的临时表(每次插入之前被截断)与原始表相同的行,但是带有已解析的外键;
 3)我通过从临时表中选择值来在目标表中执行批量插入。

为什么要使用临时表?因为我想避免在具有超过50百万行的目标表中逐行插入。

(我已经将oracle sql架构和解决方案结构的一部分弄得一团糟;我甚至无法更改它,因为目前有一组监控工具无法更改)。

如何在目标表中插入新行之前解析外键来优化代码?是否还有其他更好的扩展解决方案?

我试图总结一下我复杂的工作流程,省略一些细节并概括一下上下文。

1 个答案:

答案 0 :(得分:3)

外键中有多少百分比无法解析?

您可以为每个外键主表

执行以下操作
INSERT INTO parent_table (id, name)
SELECT id.nextval, r2.name
FROM (SELECT DISTINCT r.name FROM raw)
WHERE r2.name NOT IN (SELECT name FROM parent_table)

然后你会知道它们都存在,只能插入。

或者,如果他们大部分在那里,你可以查看BULK.. EXCEPTIONS INTO并让SQL引擎告诉你哪些失败并单独处理它们。