是否可以在 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 中 如果初始化表空间已满对查询有啥影响,会不会在插入数据的时候导致数据丢失?