如何在 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进行团队脚本文件版本管理

如何修改plsql数据库列的属性值?

如何选择离线数据集成方案 - 全量&增量

如何在 pl/sql (oracle 9i) 中查找数据类型的大小?

仓库更新的增量负载