千家信息网

PostgreSQL 的存储过程怎么写

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要讲解了"PostgreSQL 的存储过程怎么写",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"PostgreSQL 的存储过程怎么写"吧!1
千家信息网最后更新 2026年11月01日PostgreSQL 的存储过程怎么写

这篇文章主要讲解了"PostgreSQL 的存储过程怎么写",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"PostgreSQL 的存储过程怎么写"吧!

1 支持了commit 和 rollback

2 帮助怎么从oracle 迁移到 postgresql 的便利性

3 符合更多传统数据库的用户(ORACLE SQL SERVER MYSQL)

最近一段反思了一下为什么MYSQL中在大型应用程序没有存储过程这个词,总结有三

1 MYSQL 本身不支持复杂的查询语句 (我没有说 mysql 8)

2 存储过程是一段SQL语句的集合,处理一些程序处理比较困难和麻烦的功能,修改程序更加灵活

3 业务比较简单,复杂的可以上移到程序层

那不支持存储过程到底好不好,这的见仁见智了,在说下去估计就有人不欢喜了。

Ok 我们的回到PG的存储过程,在PG11 之前也是没有存储过程的,但又一种变通的方式 create function 。PG 11 支持了比较完整的存储过程,但网上的资料如果是中文的,属于残壁断垣,英文的其实也没有多少,估计大部分PG的使用环境还在 PG 9.4 , PG 10这个level。

关于存储过程的优点:PG 官方也给了以下内容(其实这是存储过程的优点)

 客户端和服务端之间额外的传输将被取消.
客户端不需要也不用客户端和服务端之间进行封装或者传输的中间结果。

可以避免命令的多轮解析


在目前的PG11 中如果你要返回一个表的查询内容,从现在11到PG12,目前存储过程



是无法满足这个需求的。目前如果要通过函数来完成在一段PLPGSQL中输出某个表的


集合。






CREATE OR REPLACE function insert_data(type varchar(10), content text)


RETURNS TABLE( id int, log_type varchar(10), log_content text, insert_date timestamp)


LANGUAGE plpgsql


AS $$


BEGIN






if( to_regclass('public.log_save') is null ) then






CREATE TABLE public.log_save


(


id serial,


log_type character varying(10),


log_content text,


insert_date timestamp without time zone,


PRIMARY KEY (id)


)


WITH (


OIDS = FALSE,


FILLFACTOR = 80,


autovacuum_enabled = TRUE


);






ALTER TABLE public.log_save OWNER to admin;






end if;






insert into public.log_save (log_type,log_content,insert_date) value


(type,content,now());






RETURN QUERY select * from public.log_save;






END;



$$;



select insert_data ('simple','this is test log');


函数是通过 select 的方式来调用的。






上面是目前可以通过函数来完成调用表结果集的方式。







通过查阅资料,目前postgresql 的存储过程和函数之间的区别可以总结成


1 存储过程中可以包含commit rollback


2 函数可以有return 返回值输出


3 存储过程支持 savepoint 功能


CREATE OR REPLACE PROCEDURE insert_D (type varchar(10),content text)

LANGUAGE plpgsql

AS $$

BEGIN

if( to_regclass('public.log_save') is null ) then

CREATE TABLE public.log_save

(

id serial,

log_type character varying(10),

log_content text,

insert_date timestamp without time zone,

PRIMARY KEY (id)

)

WITH (

OIDS = FALSE,

FILLFACTOR = 80,

autovacuum_enabled = TRUE

);

ALTER TABLE public.log_save OWNER to admin;

end if;

insert into public.log_save (log_type,log_content,insert_date) values (type,content,now());

rollback;

insert into public.log_save (log_type,log_content,insert_date) values (type,content,now());

commit;

--Drop table public.log_save

END;

$$;

call insert_D('a','b');

select * from log_save;

当然在POSTGRESQL 11 开始有的存储过程,在查看一些建议和资料的时候,有以下一些需要注意的地方

1 在创建trigger 中目前如果想在触发后,如果执行函数或存储过程,建议延续之前版本,继续使用函数的方式

2 在有事务断点,或者需要设置回滚或者保存点的大型的SQL 程序集的情况下,建议使用 PROCEDURE

当然也有部分人对POSTGRESQL 的存储过程提出了异议,说他根本没有像其他的数据库有事务性,我们来看下面一段存储过程

CREATE OR REPLACE PROCEDURE check_now()
AS $$
DECLARE
i int;
BEGIN
FOR i in 1..5 LOOP
RAISE NOTICE 'It is now: %', now();
PERFORM txid_current();
COMMIT;
PERFORM pg_sleep(0.1);
END LOOP;
END;
$$

LANGUAGE plpgsql;


结果如下,质疑在哪里,有些人认为在一个事务中表达的时间是一样的,而不应该是


下面结果中的每运行一次就会更新一个时间。








个人觉得肯能是把 MYSQL 中的 NOW() 和 SYSDATE() 之间的事情搬弄到

PG中了。

我们在来一个存储过程

CREATE OR REPLACE PROCEDURE check_now1()

AS $$

DECLARE

i int;

BEGIN

FOR i in 1..5 LOOP

RAISE NOTICE 'It is now: %', now();

PERFORM txid_current();

RAISE NOTICE 'YES:i%',transaction_timestamp();

PERFORM pg_sleep(0.1);

RAISE NOTICE 'NO:i%',statement_timestamp();

COMMIT;

END LOOP;

END;

$$

LANGUAGE plpgsql;

你可以看到类似 MYSQL 中的 NOW() 与 SYSDATE() 之间的不同

目前PG的存储过程,如果算上函数的情况下,其实PG的存储过程和函数在使用中和 ORACLE , SQL SERVER 在功能上是不相上下的,但其实不然,PG的存储过程可能是使用 C 语言, PYTHON, 或其他可以接入的语言撰写,我们可以发现很多的PG的系统函数都是使用 C语言撰写的,那这样的语言执行的速度一定是要比传统的存储过程要快,所以PG 在存储过程上其实对程序员更友好,撰写存储过程可能是程序员的苦恼的地方,但如果换成他熟悉的语言,相比会轻松许多。

感谢各位的阅读,以上就是"PostgreSQL 的存储过程怎么写"的内容了,经过本文的学习后,相信大家对PostgreSQL 的存储过程怎么写这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

过程 存储 函数 程序 之间 语言 支持 内容 方式 结果 事务 功能 客户 客户端 建议 情况 资料 学习 复杂 优点 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手磨咖啡 深圳市人人互联网科技有限公司 互联网电商科技 科技企业和互联网企业 互联网络科技有限公司 互联网科技的英文 广州互联网络科技有限公司 友谊互联网络科技 广州紫鲸互联网科技 互联网科技公司介绍 互联网科技英文翻译 四个字互联网科技公司取名 深圳国际航运科技和互联网 福州新华互联网科技学校 知乎 北京华百购互联网科技有限公司 千方科技属于互联网企业吗 知域互联网科技有限公司大骗子 广西互联网科技孵化中心 珠海东科互联网科技有限公司 互联网 科技节活动 微视频大赛 南京欣网互联网科技 中国互联网金融科技基金 银川新华互联网科技职业技术培训学校图片 互联网企业和科技型企业 辽宁互联网新科技 深圳互联网科技的发展 互联网科技资金流入 互联网领先科技活动 平安好医生打造互联网科技医疗 互联网科技创新方面的资料
0