您好,欢迎访问一九零五行业门户网

Oracle存储过程中的commit 和 savepoint

$$language plpgsql;不支持存储过程,只支持function,在function之中,不支持rollback ,commit, savepointquestion 1: does pg/
oracle 11g
create or replace procedure skeleton 
is
begin
  begin
       insert into a values(10);
       begin
         insert into a values(11);
       end;
  end;
  begin
    --savepoint ps;
    insert into a values(20);
    commit;
  end;
begin
    insert into a values(30);
  end;
  insert into a values(40);
  --commit;
  rollback;
  --rollback to ps;
end;
在oracle 中,begin end 只起标记作用,commit会把前面没提交的全部提交,不管begin ,end所在的层次,而且提交后,后面的rollback 也无法回滚,
savepoint  和 rollback 可以在不同的begin end 中,而且一但commit之后,savepoint将失效。
exec skeleton();
在postgresql 9.0中
create or replace function skeleton() returns void as
$$
begin
  insert into a values(0);
  begin
    --savepoint ps;
    insert into a values(1);
    --commit;
  end;
begin
    insert into a values(2);
  end;
  insert into a values(3);
  --commit;
  --rollback to ps;
  --rollback;
end;
exception when unique_violation then
$$language plpgsql;
不支持存储过程,只支持function,
在function之中,不支持rollback ,commit, savepoint
question 1:  does pg/psql functions allow savepoint/rollback functionality? (if so how?)
yes.  however, you cannot use that syntax directly.  you rather use it by establishing exception clauses in begin/end blocks.  upon entering any begin/end block which has an exception clause, an implicit savepoint
is executed.  if any exception (read: error) is found while executing the block, the savepoint will be automatically rolled back and control passed to the exception block.
it is important not to confuse the use of begin/end for grouping statements in pl/pgsql with the database commands for transaction control. pl/pgsql's begin/end are only for grouping; they do not start or end a transaction. functions and trigger procedures are always executed within a transaction established by an outer query — they cannot start or commit that transaction, since there would be no context for them to execute in. however, a block containing an exception clause effectively forms a subtransaction that can be rolled back without affecting the outer transaction.
mysql
delimiter $$
drop procedure if exists `a`.`skeleton` $$
create procedure `a`.`skeleton` ()
begin
 begin
       insert into a values(10);
       begin
         insert into a values(11);
       end;
      -- rollback;
  end;
  begin
    insert into a values(20);
    -- commit;
  end;
  start transaction;
  -- savepoint ps1;
  begin
    insert into a values(30);
  end;
  -- rollback to savepoint ps1;
  insert into a values(40);
  -- commit;
  rollback;
end $$
delimiter ;

其它类似信息

推荐信息