是否可以在 Oracle10g 中的同一查询中进行插入和删除?

Posted

技术标签:

【中文标题】是否可以在 Oracle10g 中的同一查询中进行插入和删除?【英文标题】:Is it possible to do Insert and Delete in a same query in Oracle10g? 【发布时间】:2011-12-30 07:09:30 【问题描述】:

我的要求是,我需要根据某些条件将我的SOURCE 表中的一些记录插入到TARGET 表中[我从通过游标运行的ANOTHER 表中获取的条件]。插入TARGET 表后不久,我需要从SOURCE 中删除记录。这个流程一直持续到CURSOR 变空。

由于我的表中有很多记录,因此需要时间。有没有其他简单的方法来实现这一点??

我上面提到的都是我在存储过程中编写的。

提前致谢。

【问题讨论】:

【参考方案1】:

您可能需要编写一个触发函数,其中如果两个表中的主键相等,则表 source 上包含该 的记录要删除的主键

【讨论】:

【参考方案2】:

    不,你不能“在同一个查询中”

    不过,听起来,您可能会在服务器之间进行多次往返。这可以优化。

    一种方法可能是为您的插入分配一个触发器(在您的应用程序不必启动它们的情况下执行适当的“删除”)

    另一种可能是编写一个存储过程(它在服务器端完成所有可能的工作,没有任何无关的往返行程)。

此链接可能会有所帮助:

http://www.devshed.com/c/a/Oracle/Developing-Simple-PL-SQL-Stored-Procedures-for-CRUD-Operations/

【讨论】:

【参考方案3】:

merge 语句最终可以删除一些匹配的记录。

在以下示例中,您可以注意到在合并后包含四个记录的表可能会同时受到插入、更新和删除的影响。

SQL> create table xxx as
  2  select rownum as rn, 'xxx' as pla
  3  from dual
  4  connect by rownum < 5
  5  /

Table created
SQL> select *
  2  from xxx
  3  /

        RN PLA
---------- ---
         1 xxx
         2 xxx
         3 xxx
         4 xxx
SQL> merge into xxx tgt using (
  2         select rownum as rn,mod(rownum,2) as even_odd
  3         from dual
  4         connect by rownum < 6
  5     ) src on (tgt.rn = src.rn)
  6  when matched then update set tgt.pla = null
  7     delete where even_odd = 1
  8  when not matched then insert(rn,pla) values (src.rn,'XXX')
  9  /

5 rows merged
SQL> select *
  2  from xxx
  3  /

        RN PLA
---------- ---
         2 
         4 
         5 XXX

SQL> 

【讨论】:

以上是关于是否可以在 Oracle10g 中的同一查询中进行插入和删除?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在同一个文件中的多个不相关查询上使用 Oracle sql WITH CLAUSE?

Oracle 10g:在视图中排序兄弟

Oracle Forms 10g 自动查询

oracle 10g 中 如果初始化表空间已满对查询有啥影响,会不会在插入数据的时候导致数据丢失?

在 oracle 表单 10g 中的 LOV 填充后未触发后查询触发器

oracle 10g中如何缓存函数的查询结果?