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

时间:2011-12-30 07:09:30

标签: sql plsql oracle10g cursor

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

因为我的表中有很多记录需要时间。是否有其他简单的方法来实现这一目标?

无论我上面提到的是我在存储过程中写的内容。

提前谢谢。

3 个答案:

答案 0 :(得分:2)

您可能需要编写触发器功能,如果两个表中的主键相等,则表上的记录包含要删除的主键

答案 1 :(得分:2)

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

  2. 听起来,就像你可能会在服务器上进行大量往返一样。 可以进行优化。

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

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

  5. 此链接可能有所帮助:

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

答案 2 :(得分:1)

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>