$$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 ;
,