首页 > > > PostgreSQL 11新特性解读|支持存储过程
PostgreSQL 11 版本一个重量级新特性是对存储过程的支持,同时支持存储过程嵌入事务,存储过程是很多 PostgreSQL 从业者期待已久的特性,尤其是很多从Oracle转到PostgreSQL朋友,尽管PostgreSQL提供函数可以实现大多数存储过程的功能,但在函数中无法执行事务实现部分提交,换句话说,函数中的SQL要么都执行成功,要不全部返回失败。
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' } ...CALL name ( [ argument ] [, ...] )存储过程调用比较简单,使用
CREATE TABLE t1 (id int4);CREATE TABLE t1_log (ctime timestamp(6) without time zone , operation text,ins_values int4);
CREATE OR REPLACE PROCEDURE ins_t1(a integer) AS $$BEGIN INSERT INTO t1(id) VALUES(a); INSERT INTO t1_log(ctime,operation,ins_values) VALUES (clock_timestamp(),'INSERT',a);END$$ LANGUAGE 'plpgsql';
调用存储过程 ins_t1(),如下
francs=> CALL ins_t1(1);CALL
查看表 t1 和 t1_log 记录。
francs=> SELECT * FROM t1; id---- 1(1 row)francs=> SELECT * FROM t1_log; ctime | operation | ins_values----------------------------+-----------+------------ 2018-09-25 15:08:16.026122 | INSERT | 1(1 row)
以上看出两条SQL都已提交。
CREATE OR REPLACE PROCEDURE ins_t1_part(a integer) AS $$BEGIN INSERT INTO t1(id) VALUES(a); COMMIT; INSERT INTO t1_log(ctime,operation,ins_values) VALUES (clock_timestamp(),'INSERT',a); ROLLBACK;END$$ LANGUAGE 'plpgsql';
调用存储过程ins_t1_part(),如下
francs=> CALL ins_t1_part(2);CALL
查看表t1和t1_log记录。
francs=> SELECT * FROM t1; id---- 1 2(2 rows)francs=> SELECT * FROM t1_log; ctime | operation | ins_values----------------------------+-----------+------------ 2018-09-25 15:08:16.026122 | INSERT | 1(1 row)
发现t1表的数据已提交,而t1_log表的数据没有提交,验证了存储过程支持嵌入式事务。
1.CREATE PROCEDUR
2.TECH PREVIEW: POSTGRESQL 11 – CREATE PROCEDUR
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69917105/viewspace-3143326/ ,如需转载,请注明出处,否则将追究法律责任。