create or replace procedure xt_pro5(num number) is
v_job emp.job%type;
begin
select job into v_job from emp where empno=num;
if v_job='PRESIDENT' then
update emp set sal=sal+9 where empno=num;
elsif v_job='MANAGER' then
update emp set sal=sal+8 where empno=num;
else
update emp set sal=sal+7 where empno=num;
end if;
end;
/上面创建了一个存储过程。在执行该存储过程前,做了SQL> savepoint aaa;的操作,
但是SQL>exec xt_pro('7777');成功修改了sal数据后,做回滚操作SQL> rollback to savepoint aaa;后提示 从未创建保存点 'AAA',不知是什么原因?
中间没有任何commit的操作。
v_job emp.job%type;
begin
select job into v_job from emp where empno=num;
if v_job='PRESIDENT' then
update emp set sal=sal+9 where empno=num;
elsif v_job='MANAGER' then
update emp set sal=sal+8 where empno=num;
else
update emp set sal=sal+7 where empno=num;
end if;
end;
/上面创建了一个存储过程。在执行该存储过程前,做了SQL> savepoint aaa;的操作,
但是SQL>exec xt_pro('7777');成功修改了sal数据后,做回滚操作SQL> rollback to savepoint aaa;后提示 从未创建保存点 'AAA',不知是什么原因?
中间没有任何commit的操作。
没发现问题
SQL> create or replace procedure proc_t
2 as
3 begin
4 insert into t_a values(1,1);
5 end;
6 /
Procedure created
SQL> savepoint aaa;
Savepoint created
SQL> exec proc_t;
PL/SQL procedure successfully completed
SQL> rollback to savepoint aaa;
Rollback complete
SQL> select * from t_a;
COL1 COL2
---------- ----------
SQL>
savepoint xxx;
exec xt_pro(7369);
rollback to xxx;
是肯定没有问题的
如这之间执行了类似DDL语句,不论是否执行成功,
DDL会先隐含提交。
SQL> savepoint sp1;保存点已创建。SQL> create table a(a error_type);
create table a(a error_type)
*
第 1 行出现错误:
ORA-00902: 无效数据类型
SQL> rollback to sp1;
rollback to sp1
*
第 1 行出现错误:
ORA-01086: 从未创建保存点 'SP1'SQL>
如果把create table 写成craate table那就不会提交的.
貌似是先粗略判断下,如果说ddl语句就先commit,然后去执行ddl,然后执行过程中再进行更加详细的判断,比如数据类型什么的.
Table truncated
SQL> insert into t_a values(1,1);
1 row inserted
SQL> craate table tt(id nu);
craate table tt(id nu)
ORA-00900: 无效 SQL 语句
SQL> rollback;
Rollback complete
SQL> select * from t_a;
COL1 COL2
---------- ----------
SQL> insert into t_a values(1,1);
1 row inserted
SQL> create table t_tt(id nu);
create table t_tt(id nu)
ORA-00902: 无效数据类型
SQL> rollback;
Rollback complete
SQL> select * from t_a;
COL1 COL2
---------- ----------
1 1
SQL>
Savepoint created
SQL> commit;
Commit complete
SQL> rollback to a;
rollback to a
ORA-01086: savepoint 'A' never established
找了下原因,是我在 create 之前做了savepoint的操作,所有create之后point就不存在了。当然不能rollback回去。在create之后再做保存点就可以了。 谢谢大家的讨论!