我正在使用以下查询将数据从一个表复制到同一个数据库中的另一个表“insert into table select * from time_stamp < =(从double中选择ADD_MONTHS(sysdate,-1)) “但我需要一次限制为1000行,然后提交更改并继续复制。有人可以帮我解决这个问题吗?oracle sql批处理
回答
你为什么要那样做?它使得这个过程变得更慢,更难编码,在发生错误时难以恢复。
除非您有特殊原因,否则只会在最后提交。否则,你必须编写PL/SQL来完成它。
你的代码应该是:
insert into table
select *
from table
where time_stamp <= ADD_MONTHS(sysdate,-1);
该代码完美工作,但记录数量以百万为单位,最好是批量复制 –
@ user3274312 - 为什么你认为最好是批量分发? ([这是Tom Kyte认为它不是的一个例子](http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4951966319022#4959613293151),这与大卫所说的相呼应)。 –
对于“数百万”,我会考虑直接路径插入,如果您可以在插入过程中锁定表格。 –
这是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;
我还没有测试,但这是更多关于一个想法如何做到这一点。
将'SAVE EXCEPTIONS'附加到您的FORALL可能会捕获异常(约束)并进入下一个记录。否则当发生一个异常时它会停止。来自[Oracle Docs]的更多详细信息(http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/tuning.htm#i49099) –
- 1. Oracle SOA中的批处理
- 2. Oracle批处理数据库
- 3. Oracle在批处理文件中导入批处理文件
- 4. 批处理VS SQL语句
- 5. SQL批处理删除
- 6. PL/SQL Oracle错误处理
- 7. 使用批处理文件循环访问Oracle SQL脚本
- 8. 将参数从批处理文件传递给Oracle SQL文件
- 9. 通过批处理文件连接Oracle
- 10. EclipseLink 2.3加上Oracle 11g批处理
- 11. 批处理DataFieldMaxValueIncrementer
- 12. SQL批处理查询处理(SQL查询输入数组)
- 13. Java&SQL - 批处理必须执行或清除批处理时出错
- 14. 从批处理cmd窗口执行SQL Plus SQL命令挂起
- 15. 休眠批处理
- 16. 清理批处理preparedstatements
- 17. 组织SQL批处理语句
- 18. 以批处理模式选择JDBC SQL
- 19. 在批处理中执行SQL脚本
- 20. 在sql中处理批量插入
- 21. 批处理sql服务器错误
- 22. SQL触发批处理文件
- 23. C#和SQL Server 2008批处理更新
- 24. 批处理文件中的SQL结果
- 25. 分组在SQL Server中的批处理
- 26. 创建批处理的sql语句
- 27. Codeigniter - 插入批处理 - 我的sql
- 28. 连接到SQL从批处理脚本
- 29. 在单独的批处理文件中执行sql批处理文件
- 30. 批处理docx
如果您需要复制整个表格,请尝试使用CTAS(创建表格作为选择),然后一次完成。 – tbone