存储过程里有两条DML语句,需要每条都ROOLBACK吗?

dasdfsadasdfa 2011-12-19 02:25:29
小弟的存储过程有两个DML语句,我担心前一个执行一个成功了,后面了失败的情况,就在每个DML语句
之后都加上ROOLBACK语句,需要吗,有一种说法是:如果只有一句DML语句的话可以不用加ROLLBACK
(我的理解是不是ORACLE 会隐式ROOLBACK)
如果有两条以上DML操作的话,就需要加上了,我在两句DML语句都没有异常的情况写
一并COMMIT的,大家看我下面贴上的写法严谨吗,如果不合适,请指教!!!

BEGIN

......
......
......

BEGIN

UPDATE CUR_TRAN_RECORD
SET LASTUPDATE = TO_CHAR(SYSDATE,'YYYYMMDD'),
STARTDATE = I_STARTDATE,
ENDDATE = I_ENDDATE
WHERE ACCNO = I_ACCNO
AND SUBACC = I_SUBACC
AND (STARTDATE IS NULL AND ENDDATE IS NULL);

EXCEPTION
WHEN OTHERS THEN
O_RETCODE :='EBPT070001'|| '*' ||'errorcode:'||sqlcode||' errmessage:'||sqlerrm;

ROLLBACK;

RETURN;

END;

BEGIN

DELETE FROM CUR_TRAN_RECORD
WHERE ACCNO = I_ACCNO
AND SUBACC = I_SUBACC
AND ( STARTDATE <> I_STARTDATE OR ENDDATE <> I_ENDDATE);
EXCEPTION
WHEN OTHERS THEN
O_RETCODE :='EBPT070002'|| '*' ||'errorcode:'||sqlcode||' errmessage:'||sqlerrm;

ROLLBACK;

RETURN;
END;

COMMIT;

......
......
......

END CORE_QUERY;

...全文
127 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
灰哥 2011-12-19
  • 打赏
  • 举报
回复
如果你不是自主事务: AUTONOMOUS_TRANSACTION
你的过程中只要有异常,整个过程是不会执行成功的.
事务中的所有动作要么都发生,要么都不发生
nanjiwubingqq 2011-12-19
  • 打赏
  • 举报
回复
楼上的队数据库颇有研究啊
huan_lxyd 2011-12-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yixilan 的回复:]

不需要写两个ROLLBACK。
一个即可。
因为Rollback操作会对之前所有表的操作都进行Rollback
Commit操作会对之前所有表的成功操作都进行Commit。

一定会是一致的。
[/Quote]
+1
我心飞翔 2011-12-19
  • 打赏
  • 举报
回复
只要一个ROLLBACK即可。
007-x 2011-12-19
  • 打赏
  • 举报
回复
lz的rollback后紧跟了一个return,只要有一个跑进异常,后面的代码就不会执行了,所以不会影响后面的逻辑。同时rollback或者commit是session级的,前面没有提交(或回滚)的在这个时候都会回滚或提交。
nvhaixx 2011-12-19
  • 打赏
  • 举报
回复
同意!
[Quote=引用 1 楼 yixilan 的回复:]
不需要写两个ROLLBACK。
一个即可。
因为Rollback操作会对之前所有表的操作都进行Rollback
Commit操作会对之前所有表的成功操作都进行Commit。

一定会是一致的。
[/Quote]
yixilan 2011-12-19
  • 打赏
  • 举报
回复
不需要写两个ROLLBACK。
一个即可。
因为Rollback操作会对之前所有表的操作都进行Rollback
Commit操作会对之前所有表的成功操作都进行Commit。

一定会是一致的。

17,086

社区成员

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

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