一、综述
今天在PostgreSQL遇到一个奇怪的现象,简而言之,是想用函数(存储过程)实现插入记录,整个过程没报错但事后却没找到记录!忙活半天,才发现原因是PostgreSQL函数(存储过程)有自动COMMIT或ROLLBACK的特殊规定。
二、问题重现
以下用示例表和示例代码来重现该问题。
create table t1 ( ID int not null primary key, name varchar(20) );
涉及的存储过程是从oracle那边直接拷贝过来后再修改过的,原先是动态SQL,这里简化为静态SQL。注意其中有个commit;根据PostgreSQL的要求,对事务增加begin...exception...end,否则会有错误或警告。示例脚本代码为:
create or replace function p1(pid int, pname varchar) returns void as $$ begin begin --pg对事务的要求 insert into t1 values(pid, pname); commit; exception when others then end; --pg对事务的要求 end; $$ language plpgsql;
依次执行脚本创建存储过程、调用存储过程、查找示例表,结果如下:
postgres=#