2014-02-11 130 views
1

我正在使用以下查询将数据从一个表复制到同一个数据库中的另一个表“insert into table select * from time_stamp < =(从double中选择ADD_MONTHS(sysdate,-1)) “但我需要一次限制为1000行,然后提交更改并继续复制。有人可以帮我解决这个问题吗?oracle sql批处理

+0

如果您需要复制整个表格,请尝试使用CTAS(创建表格作为选择),然后一次完成。 – tbone

回答

4

你为什么要那样做?它使得这个过程变得更慢,更难编码,在发生错误时难以恢复。

除非您有特殊原因,否则只会在最后提交。否则,你必须编写PL/SQL来完成它。

你的代码应该是:

insert into table 
select * 
from table 
where time_stamp <= ADD_MONTHS(sysdate,-1); 
+0

该代码完美工作,但记录数量以百万为单位,最好是批量复制 –

+1

@ user3274312 - 为什么你认为最好是批量分发? ([这是Tom Kyte认为它不是的一个例子](http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4951966319022#4959613293151),这与大卫所说的相呼应)。 –

+0

对于“数百万”,我会考虑直接路径插入,如果您可以在插入过程中锁定表格。 –

1

这是PL/SQL块,你可以用它来实现自己的目标

declare 
    cursor c is 
    select * 
    from tableName 
    where time_stamp <= add_months(sysdate,-1); 

    type tbl is table of c%rowtype; 

    t  tbl; 
begin 
    open c; 

    loop 
    fetch c bulk collect into t limit 1000; 

    exit when c%notfound; 

    forall i in 1..t.count 
    insert into tableName2 values t(i); 

    commit; 
    end loop; 

    close c; 
end; 

不幸的是,我不知道您的栏,你可以重写这一部分

insert into tableName2 values t(i); 

eg像那

insert into tableName2(col1,col2) values t(i).col1,t(i).col2; 

我还没有测试,但这是更多关于一个想法如何做到这一点。

+1

将'SAVE EXCEPTIONS'附加到您的FORALL可能会捕获异常(约束)并进入下一个记录。否则当发生一个异常时它会停止。来自[Oracle Docs]的更多详细信息(http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/tuning.htm#i49099) –