我有两个数组,我将使用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的一部分插入表中,是否会更新?
答案 0 :(得分:2)
MERGE with FORALL - 不支持,除非最近发生了某些变化(也许是12c?)。这背后的原因是MERGE语句隐式执行与FORALL相同的操作,因为USING子句可以从各种源(包括PL / SQL集合)中选择多个值。我从来没有试过这个 但我见过例子,包括this AskTom posting。
如果在UPDATE之前执行INSERT,则在执行UPDATE时将显示INSERTed值。
分享并享受。