ORACLE中游标和COMMIT的问题

tongtian245 2011-03-09 12:10:05
假设有下面的逻辑
 DECLARE 
CURSOR EMP_CURSOR SELECT * FROM TEST; --TEST(ID,NAME,SAL),ID为主键
BEGIN
OPEN EMP_CURSOR
LOOP
FETCH EMP_CURSOR INTO V_ID,V_NAME,V_SAL;
EXIT WHEN EMP_CURSOR%NOTFOUND;
UPDATE TEST SET SAL=SAL+100 WHERE ID=V_ID;
COMMIT; -----------第一个
END LOOP;
CLOSE EMP_CURSOR;
--COMMIT; -----------第二个
END;

COMMIT写在第一个地方和第2个地方有什么区别?????
是不是说写在第一个地方 就是 每更新一行 COMMT后就释放资源,并将更新后的数据永久保存??第二个地方是说
更新完所有的行后,释放资源,并将更新后数据永久保存???

俩者哪个性能更好???????????????????
...全文
904 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
UPC子夜 2011-03-09
  • 打赏
  • 举报
回复
放在第一个地方就是每循环一次提交一次,永久保存
放在第二个地方是循环完统一提交
从效率上看 第二个对数据库的要求小 第一个频繁提交 增加数据库的io操作 不建议使用

这个还要参考你的具体业务
如果想要保证数据的完整性 就用第二个 因为万一中间出现异常 就会全部回滚 而使用第一个只能回滚当前一条记录
如果没有这个要求 可以使用第一个
yanran_hill 2011-03-09
  • 打赏
  • 举报
回复
没有绝对的永远正确的事情,如果游标内的记录数不多,应该是第二位置好,不过放在第一个位置也看不出对性能的影响有多大.
如果游标内的记录数很多,比如上亿条,那么就要考虑一下什么时候commit比较合适了,我一般的做法是每更新:2000条commit一次
  • 打赏
  • 举报
回复
[Quote=引用楼主 tongtian245 的回复:]
假设有下面的逻辑

SQL code
DECLARE
CURSOR EMP_CURSOR SELECT * FROM TEST; --TEST(ID,NAME,SAL),ID为主键
BEGIN
OPEN EMP_CURSOR
LOOP
FETCH EMP_CURSOR INTO V_ID,V_NAME,V_SAL;
EXIT WHEN EM……
[/Quote]
放在第一个位置表示每更改一就提交,
放在第二个位置表示全部更改完后再统一提交

个人建议放在第二个位置
心中的彩虹 2011-03-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 tongtian245 的回复:]
假设有下面的逻辑

SQL code
DECLARE
CURSOR EMP_CURSOR SELECT * FROM TEST; --TEST(ID,NAME,SAL),ID为主键
BEGIN
OPEN EMP_CURSOR
LOOP
FETCH EMP_CURSOR INTO V_ID,V_NAME,V_SAL;
EXIT WHEN EM……
[/Quote]
看数据量

数据量大的话加个判断 多少条记录更新 在第二个地方 处理下就可以了
huangdh12 2011-03-09
  • 打赏
  • 举报
回复
事务大和小有关系吧。 如果数据量大,就应该是第一个。 如果量小 是没什么问题的。
kakaxi 2011-03-09
  • 打赏
  • 举报
回复
同意楼上。再说两点,
1。看数据库的能力,如果大级别的COMMIT,建议1000~10000个UPDATE后COMMIT一次,
2。如果真实的程序像你所写的这么简单,那么不需要写这个LOOP,直接用一句UPDATE完成就可以。注意如果UPDATE数据量太大,就要考虑数据库的能力,主要是IO的能力,IBM 8100S可以一小时UPDATE大概7000万以上的数据。
QKForex 2011-03-09
  • 打赏
  • 举报
回复
如果是大数据量的操作,比如上百万级别的cursor,建议还是放在里面,如果数据量很小再放在外面。要综合考虑undo空间大小和commit的效率(提交也耗时间的)。
青色刀客 2011-03-09
  • 打赏
  • 举报
回复
建议lz看一下《Wrox-Oracle专家高级编程-Expert_one-on-one_Oracle》这本书。里面有对commit的讨论。

你的问题应该是commit的问题不必要带上游标。

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧