Oracle中的条件插入或更新

时间:2012-01-17 16:07:12

标签: performance oracle stored-procedures insert

我在oracle中有一个表,从第三方插入数据。我想从该表填充主表。那么,使用集合的性能最佳方式是什么。

E.g。假设,从第三方填充数据的表是'EMP_TMP'。

现在我想通过程序填充'EMPLOYEE'主表,该程序将从EMP_TMP表填充。

这里又有一个条件,如IF SAME EMPID(这不是主键)EXISTS然后我们必须UPDATE FULL TABLE,它包含SAME EMPID ELSE,我们有INSERT NEW RECORD。

[注意:这里EMPID是VARCHAR2,EMPNO将是我们将使用SEQUENCE的主键]

我认为合并在性能方面不会表现得更好,因为我们无法在MERGE语句中使用集合。

2 个答案:

答案 0 :(得分:0)

好吧,如果性能是您的主要考虑因素,并且您不喜欢MERGE,那么如何(以脚本,单个事务运行):

delete from EMPLOYEE where emp_id IN (
select emp_id from EMP_TMP);

insert into EMPLOYEE
select * from EMP_TMP;

commit;

显然不是“最安全”的方法(并且书面假定完全相同的表定义并且你有回滚),但应该很快(你也可能混乱使用IN vs EXISTS等)。如果emp_id或emp_no是这两个表中的常用密钥,我就无法理解你的帖子,但是在你的情况下使用任何有意义的东西。

答案 1 :(得分:0)

创建一个过程,您需要使用PL / SQL。 首先进行更新,然后测试sql%rowcount。 如果为0,则不进行更新,而是必须进行插入。

我认为这是相当有效的。

伪代码

Update table;
if sql%rowcount = 0 then
   //get new sequence number
   insert into table;
END IF;
COMMIT;
HTH
HARV