如何在 PL/SQL 中增量集成数据
Posted
技术标签:
【中文标题】如何在 PL/SQL 中增量集成数据【英文标题】:How to integrate data incrementally in PL/SQL 【发布时间】:2021-04-08 23:47:07 【问题描述】:如何将两个不同表中的数据增量插入到另一个表中?
假设我有表 A 和 B,我想在表 C 中增量插入行。行应该只插入一次(如果该行已经存在,则不应插入任何内容)并且不能在表 C 中更新或删除。
我认为它可以在循环中使用游标,然后如果不匹配则合并并插入数据。我是否完全错了,因为我收到错误消息“表或视图不存在”。
for x in A --cursor with data from given table
loop
MERGE INTO C USING A
ON (x.id = C.id)
WHEN NOT MATCHED THEN
insert(C.id, C.email, C.address) values(x.id, x.email, x.address);
end loop;
for x in B --cursor with data from given table
loop
MERGE INTO C USING B
ON (x.id = C.id)
WHEN NOT MATCHED THEN
insert(C.id, C.email, C.address) values(x.id, x.email, x.address);
end loop;
【问题讨论】:
这有帮助吗? ***.com/questions/8333657/… 我没有得到 using 部分 -> using( select x.col1 col1, x.col2 col2 from dual ) src。你能解释一下吗? 根据documentation for MERGE 语句,在单词 USING 之后可以有一个 SELECT 或一个表或视图的名称。在链接的答案中,他们使用子查询。为了访问游标的列,您需要某种 SELECT。因此,SELECT ... FROM DUAL
总是只返回一行。
【参考方案1】:
Merge 采用 select 语句,而不是游标。某处你的代码有“光标A是选择...”,然后你尝试“使用(A)合并到表中......”但是合并需要一个实际的选择。正确的格式是“merge into c using(select ...) A”并去掉光标。
merge into c
using ( select id, email, address
from a
) x
on (x.id = c.id)
when not matched then
insert(c.id, c.email, c.address)
values(x.id, x.email, x.address);
merge into c
using ( select id, email, address
from b
) x
on (x.id = c.id)
when not matched then
insert(c.id, c.email, c.address)
values(x.id, x.email, x.address);
【讨论】:
但是当你删除循环时,这是否会增量插入行? 它将插入所有id当前不存在的地方。但我不知道“增量插入行”是什么意思。但基本上我相信你在想,如果没有循环,你只会得到 1 行。 SQL 不能那样工作。 SQL 一次对整个集合起作用。在这种情况下,假设选择 A 获得 500 行,其中 300 行在 C 中不存在,则插入这 300 行。 B也是如此。以上是关于如何在 PL/SQL 中增量集成数据的主要内容,如果未能解决你的问题,请参考以下文章
Oracle PL/SQL Developer集成TFS进行团队脚本文件版本管理
Oracle PL/SQL Developer集成TFS进行团队脚本文件版本管理