Postgresql Postgres中奇怪的异常处理

Postgresql Postgres中奇怪的异常处理,postgresql,exception,plpgsql,Postgresql,Exception,Plpgsql,我试图理解PL/pgSQL中的异常处理,但是 案例1: CREATE OR REPLACE PROCEDURE ins () AS $$ DECLARE i INT; BEGIN insert into scott.emp (empno) values (9000); commit; i:=1/0; EXCEPTION WHEN OTHERS THEN --rollback; END $$ LANGUAGE plpgsql; call ins(); 我猜这行是插入的,但不是 案例2: CRE

我试图理解PL/pgSQL中的异常处理,但是

案例1:

CREATE OR REPLACE PROCEDURE ins ()
AS $$ DECLARE
i INT;
BEGIN
insert into scott.emp (empno) values (9000);
commit;
i:=1/0;
EXCEPTION WHEN OTHERS THEN
--rollback;
END $$ LANGUAGE plpgsql;

call ins();
我猜这行是插入的,但不是

案例2:

CREATE OR REPLACE PROCEDURE ins ()
AS $$ DECLARE
i INT;
BEGIN
insert into scott.emp (empno) values (9000);
commit;
--i:=1/0;
EXCEPTION WHEN OTHERS THEN
--rollback;
END $$ LANGUAGE plpgsql;

call ins();
现在,没有div by zero,但是表中没有行

案例3:

CREATE OR REPLACE PROCEDURE ins ()
    AS $$ DECLARE
    i INT;
    BEGIN
    insert into scott.emp (empno) values (9000);
    commit;
    --i:=1/0;
    --EXCEPTION WHEN OTHERS THEN
    --rollback;
    END $$ LANGUAGE plpgsql;

    call ins();
现在插入该行。似乎这个问题是我的异常块,但为什么呢

提前谢谢。
Marco

悄悄地扔掉错误消息确实会使调试变得困难

CREATE OR REPLACE PROCEDURE ins ()
AS $$ DECLARE
i INT;
BEGIN
insert into scott.emp (empno) values (9000);
commit;
--i:=1/0;
EXCEPTION WHEN OTHERS THEN
raise notice E'%', SQLERRM;
END $$ LANGUAGE plpgsql;
显示:

NOTICE:  cannot commit while a subtransaction is active
这是由于:

事务不能在具有异常处理程序的块内结束


悄悄地丢弃错误消息确实会使调试变得困难

CREATE OR REPLACE PROCEDURE ins ()
AS $$ DECLARE
i INT;
BEGIN
insert into scott.emp (empno) values (9000);
commit;
--i:=1/0;
EXCEPTION WHEN OTHERS THEN
raise notice E'%', SQLERRM;
END $$ LANGUAGE plpgsql;
显示:

NOTICE:  cannot commit while a subtransaction is active
这是由于:

事务不能在具有异常处理程序的块内结束

在此处阅读完整解释:在此处阅读完整解释: