FOR ALL ALL Bulk语句中插入记录的可见性

时间:2013-07-24 20:15:28

标签: oracle plsql oracle11g bulkinsert

我有两个数组,我将使用FORALL来插入/更新。我不确定我是否可以在FORALL中使用“MERGE”语句,因此我使用两个数组。

在数组中填充数据时,我会检查它是否已经在db中。如果是,我将填充的数据放在一个数组中,这个数组意味着要更新,否则就会插入数组。

TYPE T_TABLE IS TABLE OF TABLE_1%ROWTYPE INDEX BY PLS_INTEGER;
TAB_I T_TABLE;
TAB_U T_TABLE;
--..more code
BEGIN
 SELECT COUNT(*) INTO rec_exist FROM TABLE_1 where COL_1 = ID;
EXCEPTION
 WHEN NO DATA FOUND THEN
   rec_exist := 0;
END;
--.... more code
-- COL1 is PK
IF rec_exist = 0 THEN
 TAB_I(IDX_I).COL1 = col1;
 TAB_I(IDX_I).COL2 = col2;
 IDX_I = IDX_I+ 1;
ELSE
 TAB_U(IDX_U).COL1 = col1;
 TAB_U(IDX_U).COL2 = col2;
 IDX_U = IDX_U+ 1;
END IF:

我发送这些表后每1000条记录插入/更新一次。

现在的问题是,想象一下我收到了table_1中不存在的记录。我决定把它放在tab_i数组中。我收到了此记录的另一个记录更新。由于它不在表格中,我将决定放入tab_i,这将在我将其插入forall循环时给我一个问题。

现在,如果我的forall循环就像

FORALL ..   INSERT

FORALL ..   更新

COMMIT;

如果,我将记录更新为“更新”语句的一部分,该语句尚未在表中,但作为上面的forall的一部分插入表中,是否会更新?

1 个答案:

答案 0 :(得分:2)

MERGE with FORALL - 不支持,除非最近发生了某些变化(也许是12c?)。这背后的原因是MERGE语句隐式执行与FORALL相同的操作,因为USING子句可以从各种源(包括PL / SQL集合)中选择多个值。我从来没有试过这个  但我见过例子,包括this AskTom posting

如果在UPDATE之前执行INSERT,则在执行UPDATE时将显示INSERTed值。

分享并享受。