由于遗留系统的愚蠢限制,我试图使用一个语句编写以下查询:
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) )。
有任何解决方法吗?
答案 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
,另一个用于delete
。 Returning
只会帮助您保存例如id。
Oracle提供returning into
个关键字