使用Oracle中的单个语句在表之间移动行

时间:2016-11-03 09:02:57

标签: sql oracle

由于遗留系统的愚蠢限制,我试图使用一个语句编写以下查询:

insert into dbo.mytable_archive 
  select * 
    from dbo.mytable 
   where date < trunc(sysdate) - 14;

delete from dbo.mytable 
 where date < trunc(sysdate) - 14;

使用Google的强大功能我发现在使用SQL Server中的RETURNING子句i Postgres或OUTPUT子句的许多其他数据库中这似乎是可能的,但我无法找到Oracle的等效解决方案(V12) )。

有任何解决方法吗?

4 个答案:

答案 0 :(得分:4)

如果你的陈述在午夜左右运行并且可能需要超过1秒,你最好这样做:

create or replace procedure move_to_arch as
   theDate DATE := trunc(sysdate) - 14;
begin
insert into dbo.mytable_archive 
  select * 
    from dbo.mytable 
   where date < theDate ;

delete from dbo.mytable 
 where date < theDate ;
commit;
end;
/

答案 1 :(得分:1)

你有什么限制?如果你想调用单一陈述,你可以:

create or replace procedure move_to_arch as
begin
insert into dbo.mytable_archive 
  select * 
    from dbo.mytable 
   where date < trunc(sysdate) - 14;

delete from dbo.mytable 
 where date < trunc(sysdate) - 14;
commit;
end;
/

然后发表一个声明:

exec move_to_arch();

答案 2 :(得分:0)

使用内存表缓存删除语句的结果。这避免了从磁盘读取记录两次。

create or replace procedure move_to_arch as
  TYPE mytableType IS table OF dbo.mytable%ROWTYPE;
  t mytableType;
begin
  delete from dbo.mytable 
  where date < trunc(sysdate) - 14
  RETURNING col1,col2 BULK COLLECT INTO t;

  FORALL J IN t.FIRST..t.LAST
    INSERT INTO dbo.mytable_archive VALUES t(J);
end;
/

答案 3 :(得分:-1)

您仍需要2个语句,一个用于insert,另一个用于deleteReturning只会帮助您保存例如id。 Oracle提供returning into个关键字