postgresql 11 的 procedure 里使用 commit、rollback

os: centos 7.4
db: postgresql 11.5

postgresql 11 之前的版本,function 和 procedure 是一回事,但是从 11 开始就不一样了。

版本

# cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core) 
# 
# su - postgres
Last login: Sat Oct 26 22:55:25 CST 2019 on pts/0
$
$ psql -c "select version();"version                                                 
---------------------------------------------------------------------------------------------------------PostgreSQL 11.5 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-bit
(1 row)

procedure commmit

# su - postgres
$ psql
psql (11.5)
Type "help" for help.postgres=# 
postgres=# postgres=# \h create procedure
Command:     CREATE PROCEDURE
Description: define a new procedure
Syntax:
CREATE [ OR REPLACE ] PROCEDUREname ( [ [ 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'} ...

创建个批量插入函数

postgres=# create table tmp_t0 (id   int8,name varchar(100));postgres=# 
postgres=# create or replace procedure sp_insert(in_lv_cnt       int8,in_lv_batchsize int8
)
language plpgsql
as $$declarelv_i int8;beginlv_i := 0;while lv_i < in_lv_cntloopinsert into tmp_t0 select id,md5(id::varchar) as namefrom generate_series(1, in_lv_batchsize) as id;lv_i := lv_i + 1;raise notice 'inserted % batch', lv_i;commit;end loop;return;end;
$$;

调用 procedure,发现使用 select 方式已经不行了,需要使用 call 。

postgres=# select sp_insert(10,100);
ERROR:  sp_insert(integer, integer) is a procedure
LINE 1: select sp_insert(10,100);^
HINT:  To call a procedure, use CALL.postgres=# 
postgres=# 
postgres=# call sp_insert(10,100);
NOTICE:  inserted 1 batch
NOTICE:  inserted 2 batch
NOTICE:  inserted 3 batch
NOTICE:  inserted 4 batch
NOTICE:  inserted 5 batch
NOTICE:  inserted 6 batch
NOTICE:  inserted 7 batch
NOTICE:  inserted 8 batch
NOTICE:  inserted 9 batch
NOTICE:  inserted 10 batch
CALL

查看 插入的数据量

postgres=# select count(1) from tmp_t0;count 
-------1000
(1 row)

procedure rollback

包含个 rollback 试试

postgres=# truncate table tmp_t0;
postgres=# 
postgres=# create or replace procedure sp_insert_rollback(in_lv_cnt       int8,in_lv_batchsize int8
)
language plpgsql
as $$declarelv_i int8;beginlv_i := 0;while lv_i < in_lv_cntloopinsert into tmp_t0 select id,md5(id::varchar) as namefrom generate_series(1, in_lv_batchsize) as id;if (lv_i=5) thenraise notice 'rollback inserted % batch', lv_i;rollback;elseraise notice 'inserted % batch', lv_i;commit;end if;lv_i := lv_i + 1;end loop;return;end;
$$;

调用 procedure,发现使用 select 方式已经不行了,需要使用 call 。

postgres=# call sp_insert_rollback(10,100);
NOTICE:  inserted 0 batch
NOTICE:  inserted 1 batch
NOTICE:  inserted 2 batch
NOTICE:  inserted 3 batch
NOTICE:  inserted 4 batch
NOTICE:  rollback inserted 5 batch
NOTICE:  inserted 6 batch
NOTICE:  inserted 7 batch
NOTICE:  inserted 8 batch
NOTICE:  inserted 9 batch
CALL

查看 插入的数据量

postgres=# select count(1) from tmp_t0;count 
-------900
(1 row)

nice

参考:
http://postgres.cn/docs/11/sql-createprocedure.html


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部