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的操作。

解决方案 »

  1.   

    ee
    没发现问题
    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> 
      

  2.   

    e,你是不是先创建的savepoint,然后创建procedure,这时候事务被提交了,所以后面会提示从未创建保存点 'AAA'
      

  3.   

    如果只执行
    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> 
      

  4.   

    呵呵,不过前提是oracle能分辨出是ddl类型命令才可以.
    如果把create table 写成craate table那就不会提交的.
    貌似是先粗略判断下,如果说ddl语句就先commit,然后去执行ddl,然后执行过程中再进行更加详细的判断,比如数据类型什么的.
      

  5.   

    SQL> truncate table t_a;
     
    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> 
      

  6.   

    建立保存点之后,如果你执行了ddl语句(ddl语句隐含着自动commit),这将会导致你的保存点无效;SQL> savepoint a;
     
    Savepoint created
     
    SQL> commit;
     
    Commit complete
     
    SQL> rollback to a;
     
    rollback to a
     
    ORA-01086: savepoint 'A' never established
      

  7.   

    执行DDL语句时,默认为commit操作。
    找了下原因,是我在 create 之前做了savepoint的操作,所有create之后point就不存在了。当然不能rollback回去。在create之后再做保存点就可以了。           谢谢大家的讨论!