过程的 小问题

shuangyu 2004-04-07 09:31:08

create or replace proceduce proce1
as

exec 过程一

exec 过程二

exception
when others
then rollback
end
上面这样能回滚过程一和过程二中的操作吗
...全文
22 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
shuangyu 2004-04-07
  • 打赏
  • 举报
回复
看来我想重用前面的过程都不行了,我写了二个过程,一个是增加,别一个是删除
现在做修改时打算是先删除再增加,但前面的都commit了,所以只有把前二个过程拷出来写一个修改的了
skystar99047 2004-04-07
  • 打赏
  • 举报
回复
你在过程里写commit之后是不能rollback的。
如果不写的话,出错会自动rollback。
qfsb_p 2004-04-07
  • 打赏
  • 举报
回复
没有写commit的话,就没有提交的,但是如果你的session断开的时候,oracle会自动commit的
shuangyu 2004-04-07
  • 打赏
  • 举报
回复
不对,搞错了,没有写commit没有被提交
shuangyu 2004-04-07
  • 打赏
  • 举报
回复
我自己试了一下,没有写commit也提交了,看来是可以不用写commit的了,只要处理如果出错就rollback就行了吧
shuangyu 2004-04-07
  • 打赏
  • 举报
回复
这样的话我想问一下
我在p1中没有commit那么记录会插入吗,是不是自动提交的
qfsb_p 2004-04-07
  • 打赏
  • 举报
回复
CREATE OR REPLACE PROCEDURE p2 AS
BEGIN
p1;
rollback;
END;
/

这样调用的话,实际上是有回滚的,但是如果p1中的commit打开的话,回滚就没有作用了。
qfsb_p 2004-04-07
  • 打赏
  • 举报
回复
你看:
CREATE OR REPLACE PROCEDURE p1 AS
BEGIN
insert into test values (1);
--commit;
END;

bzszp 2004-04-07
  • 打赏
  • 举报
回复
可以回滚,如果上面两个过程没有commit的话。

看看下面的save point对你有没有用处。

保存点(SAVEPOINT)是事务处理过程中的一个标志,与回滚命令(ROLLBACK)结合使用,主要的用途是允许用户将某一段处理回滚而不必回滚整个事务,这在PL/SQL开发中还是很有用处的。
下面的例子中,把SAVEPOINT标记在INSERT语句之前,如果这条INSERT语句试图将重复的数据保存到EMP表中的话,将触发执行预先定义的DUP_VAL_ON_INDEX例外处理,在这里面的ROLLBACK TO do_insert命令将回滚上面的那条INSERT操作,而不会影响前面的任何操作。

DECLARE
emp_id emp.empno%TYPE;
BEGIN
UPDATE emp SET ... WHERE empno = emp_id;
DELETE FROM emp WHERE ...
...
SAVEPOINT do_insert;
INSERT INTO emp VALUES (emp_id, ...);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
ROLLBACK TO do_insert;
END;

如果你定义了多个savepoint,当你指定回滚到某个savepoint时,那么回滚操作将回滚这个savepoint后面的所有操作(即使后面可能标记了N个savepoint)。例如,在一段处理中
你定义了五个savepoint,从第三个savepoint回滚,后面的第四、第五个标记的操作都将被回滚,如果不使用ROLLBACK TO savepoint_name而使用ROLLBACK,将会滚整个事务处理。

如果你在递归子程序里面定义了一个savepoint, 如果每一个递归层都设置了SAVEPOINT. 此时, 你只能回滚到最近的一个savepoint.

Savepoint的声明可以在同一个事务处理里面重复定义. 它的作用就是把savepoint从上一个位置转移到目前的位置. 因而,执行回滚也只回滚到最近的savepoint.
下面是一个例子:

BEGIN
...
SAVEPOINT my_point;
UPDATE emp SET ... WHERE empno = emp_id;
...
SAVEPOINT my_point; -- move my_point to current point
INSERT INTO emp VALUES (emp_id, ...);
EXCEPTION
WHEN OTHERS THEN
ROLLBACK TO my_point;
END;

另外,Oracle没有对每个session里面可以使用的savepoint个数做限制.

自己翻译的,不知道翻译的准不准确,呵呵。
qfsb_p 2004-04-07
  • 打赏
  • 举报
回复
如果里面有commit的话,rollback就没有作用了
shuangyu 2004-04-07
  • 打赏
  • 举报
回复
qfsb_p(我心飞翔)
等你的结果和测试的过程
shuangyu 2004-04-07
  • 打赏
  • 举报
回复
上面的过程一、二中分别是删除和新增的操作,都有commit在里面,如果过程一执行成功了,他是不是就commit了,但过程二失败我要把过程一也回滚,可以做吗
qfsb_p 2004-04-07
  • 打赏
  • 举报
回复
我觉得是可以的,可以帮你试试看

17,089

社区成员

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

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