Oracle Merge Sql 在目标中插入并从源中删除

Posted

技术标签:

【中文标题】Oracle Merge Sql 在目标中插入并从源中删除【英文标题】:Oracle Merge Sql with insert in destination and delete from source 【发布时间】:2017-03-01 03:37:20 【问题描述】:

我有一个场景,其中我有 2 个表,第一个是源(my_data),第二个是目标(my_data_backup),我想某种归档实际数据并将该数据移动到备份表中每天并从源表中删除在 oracle 中使用 Merge SQL

my_data 和 my_data_backup 都有相同的架构

my_data 表包含 10 行,my_data_backup 包含 0 行我想将 10 条记录插入 my_data_backup 并从 my_data 中删除这些记录。

【问题讨论】:

假设在第二次运行时,您还有 5 行 my_data。现在备份应该包含 15 行并且 my_data 应该再次为空吗?备份表中的关键是什么?您确定密钥不再来自my_data 吗? 是的,正确的是两者都没有重复,在一天结束时,我会将数据从 my_data 移动到 my_data_backup。 你在说什么数据量? @BobC- 表中每天大约 1000 行,我想将它们从 my_data 移动到 my_data_backup 并在 EOD 时从 my_data 中删除这些行。 【参考方案1】:

MERGE 可用于对目标表进行操作,而不是对源表进行操作。

您可以使用匿名 PLSQL 块:

begin
    delete from my_data_backup;
    insert into my_data_backup
    select *
    from my_data;
    delete from my_data;
    commit;
exception
    when others then
        rollback;
        -- handle here
end;
/

你也可以把上面的放在一个过程中,然后调用这个过程。

您可以考虑使用 truncate 语句而不是 delete 语句,这在表大小较大时会更快,但请注意它作为 DDL 会执行隐式提交。

execute immediate 'truncate table tablename';

【讨论】:

我不想使用存储过程创建它 使用 Oracle Merge SQL 我想要这个,请你帮我摆脱这种情况 @NikhiK.Bansal - 以上是不是存储过程,它是一个匿名块 我建议你在这种情况下创建一个过程,但这里有一个没有它的解决方案 - ***.com/questions/5101529/… 好的,让我用匿名块试试你的解决方案,这可能或不使用 Merge SQL。

以上是关于Oracle Merge Sql 在目标中插入并从源中删除的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL中的Merge用法

在 SQL Server 2008 R2 的 MERGE 语句中更新插入的记录

sql server 2008中“Merge”子句的性能如何?

SQL增强之Merge

使用 T-SQL Merge 语句时如何避免插入重复记录

oracle中merge into的使用