朋友们,我们在使用PostgreSQL时,会发现PostgreSQL并不支持真正的存储过程,而只是支持类似于存储过程的函数。尽管函数可以实现大多数存储过程的功能,但在函数中无法实现事务控制,着实遗憾啊。
我们常见的数据库,诸如MySQL、SQL Server、Oracle等等都是同时支持自定义函数和存储过程的,这让大家对PostgreSQL更是充满了期待。
可喜的是,从PostgreSQL 11开始,我们终于可以抹平这个遗憾了。PostgreSQL 11一个重量级新特性就是对存储过程的支持,同时还支持存储过程嵌入事务。宝宝们终于可以开心的写COMMIT和ROLLBACK了。
使用create、alter、drop procedure命令可创建、修改或删除存储过程。创建存储过程的语法格式如下:
CREATE [ OR REPLACE ] PROCEDURE name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] ) { LANGUAGE lang_name | TRANSFORM { FOR TYPE type_name } [, ... ] | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | SET configuration_parameter { TO value | = value | FROM CURRENT } | AS 'definition' | AS 'obj_file', 'link_symbol' } ...
看上去似乎很复杂,晚点我们来个实例看看。
PostgreSQL的存储过程是没有返回值的,所以不可能像函数一样通过select调用,调用时需要使用call,与MySQL的调用命令一致,也类似于SQLServer的exec。具体语法格式如下:
CALL 存储过程名称 ( [ 参数 ] [, ...] )
下面我们通过一个简单的例子一睹存储过程的真面目。
create procedure insertdata(a integer, b integer)language sqlAS $$ insert into t1 values (a); insert into t1 values (b);$$;call insertdata(1, 2);
是不是感觉很简单?
存储过程与函数相比,最大的优势就是对事务的控制。
create or replace procedure mytest() language plpgsqlas $$begin for i in 0..100 loop insert into t1(id, name) values (i,'值:'||i); if i % 2 = 0 then commit; else rollback; end if; end loop;end;$$;
PostgreSQL的存储过程与SQL Server和MySQL比起来,还是有不少欠缺的。可能是区别于函数,其存储过程不支持返回值,如何返回结果集也未可知。在SQLServer和MySQL中,存储过程的功能是涵盖并超越自定义函数的,在PostgreSQL中却正好相反。
PostgreSQL毕竟迈出了这一步,相信以后的存储过程功能会更加强劲!