1

我有 2 个数组,我将使用它们与 FORALL 一起插入/更新。我不确定我是否可以在 FORALL 中使用“MERGE”语句,所以我使用了两个数组。

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

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 .. 插入

FORALL .. 更新

犯罪;

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

4

1 回答 1

2

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

如果您在 UPDATE 之前执行 INSERT,则在执行 UPDATE 时 INSERTed 值将可见。

分享和享受。

于 2013-07-24T22:24:00.413 回答