假设有下面的逻辑
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后就释放资源,并将更新后的数据永久保存??第二个地方是说
更新完所有的行后,释放资源,并将更新后数据永久保存???俩者哪个性能更好???????????????????
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后就释放资源,并将更新后的数据永久保存??第二个地方是说
更新完所有的行后,释放资源,并将更新后数据永久保存???俩者哪个性能更好???????????????????
如果游标内的记录数很多,比如上亿条,那么就要考虑一下什么时候commit比较合适了,我一般的做法是每更新:2000条commit一次
1。看数据库的能力,如果大级别的COMMIT,建议1000~10000个UPDATE后COMMIT一次,
2。如果真实的程序像你所写的这么简单,那么不需要写这个LOOP,直接用一句UPDATE完成就可以。注意如果UPDATE数据量太大,就要考虑数据库的能力,主要是IO的能力,IBM 8100S可以一小时UPDATE大概7000万以上的数据。