PostgreSQL11: 支持存储过程(SQL Stored Procedures)

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介:

PostgreSQL 11 版本一个重量级新特性是对存储过程的支持,同时支持存储过程嵌入事务,存储过程是很多 PostgreSQL 从业者期待已久的特性,尤其是很多从Oracle转到PostgreSQL朋友,尽管PostgreSQL提供函数可以实现大多数存储过程的功能,但在函数中无法执行事务实现部分提交,换句话说,函数中的SQL要么都执行成功,要不全部返回失败。

PostgreSQL 11 版本对存储过程的支持,从兼容层面考虑和Oracle的兼容性进一步增强,本文演示下PostgreSQL存储过程的创建和调用,并且演示存储过程支持嵌入事务样例。
发行说明
SQL stored procedures, with support for embedded transactions
存储过程创建语法
1
2
3
4
5
6
7
8
9
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 ] [, ...] )
存储过程调用比较简单,使用 CALL 命令即可,而函数的调用是使用 SELECT 命令。

存储过程嵌入事务测试
创建一个简单的存储过程演示下。

创建测试表
CREATE TABLE t1 (id int4);
CREATE TABLE t1_log (ctime timestamp(6) without time zone , operation text,ins_values int4);
创建存储过程 ins_t1
1
2
3
4
5
6
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(),如下

1
2
francs=> CALL ins_t1(1);
CALL

查看表 t1 和 t1_log 记录。

1
2
3
4
5
6
7
8
9
10
11
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都已提交。

创建存储过程 ins_t1_part
1
2
3
4
5
6
7
8
9
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(),如下

1
2
francs=> CALL ins_t1_part(2);
CALL
查看表 t1 和 t1_log 记录。

1
2
3
4
5
6
7
8
9
10
11
12
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 表的数据没有提交,验证了存储过程支持嵌入式事务。

参考
CREATE PROCEDURE
TECH PREVIEW: POSTGRESQL 11 – CREATE PROCEDURE
最后推荐和张文升共同编写的《PostgreSQL实战》,本书基于PostgreSQL 10 编写,共18章,重点介绍SQL高级特性、并行查询、分区表、物理复制、逻辑复制、备份恢复、高可用、性能优化、PostGIS等,涵盖大量实战用例!

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
4月前
|
SQL 人工智能 关系型数据库
PostgreSQL 常用SQL(持续更新...)
PostgreSQL 常用SQL(持续更新...)
|
4月前
|
SQL 关系型数据库 数据库
实时计算 Flink版操作报错之使用SQL 将 PostgreSQL 的 date 类型字段转换为 TIMESTAMP 类型时遇到报错,该如何处理
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
4月前
|
存储 SQL 数据库
数据库sql语句-----游标和存储过程
数据库sql语句-----游标和存储过程
45 1
|
17天前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
27天前
|
SQL 存储 关系型数据库
PostgreSQL核心之SQL基础学习
PostgreSQL核心之SQL基础学习
24 3
|
1月前
|
SQL 安全 关系型数据库
PostgreSQL SQL注入漏洞(CVE-2018-10915)--处理
【8月更文挑战第8天】漏洞描述:PostgreSQL是一款自由的对象关系型数据库管理系统,支持多种SQL标准及特性。存在SQL注入漏洞,源于应用未有效验证外部输入的SQL语句,允许攻击者执行非法命令。受影响版本包括10.5及更早版本等。解决方法为升级PostgreSQL
169 2
|
19天前
|
JSON 数据格式 Java
化繁为简的魔法:Struts 2 与 JSON 联手打造超流畅数据交换体验,让应用飞起来!
【8月更文挑战第31天】在现代 Web 开发中,JSON 成为数据交换的主流格式,以其轻量、易读和易解析的特点受到青睐。Struts 2 内置对 JSON 的支持,结合 Jackson 库可便捷实现数据传输。本文通过具体示例展示了如何在 Struts 2 中进行 JSON 数据的序列化与反序列化,并结合 AJAX 技术提升 Web 应用的响应速度和用户体验。
46 0
|
19天前
|
存储 SQL 数据库
如何使用 SQL Server 创建存储过程?
【8月更文挑战第31天】
49 0
|
20天前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
88 0
|
3月前
|
存储 SQL 数据库
SQL 语言:存储过程和触发器
SQL 语言:存储过程和触发器
55 6