PostgreSQL-PL/pgSQL

时间:2023-03-09 08:54:51
PostgreSQL-PL/pgSQL

参考:

https://wiki.postgresql.org/wiki/9.1%E7%AC%AC%E4%B8%89%E5%8D%81%E4%B9%9D%E7%AB%A0

摘记:

PL/pgSQL是 PostgreSQL 数据库系统的一个可装载的过程语言。

在PL/pgSQL中你可以把一块运算和一系列命令在数据库服务器里面组成一个块,因此这样就拥有了过程语言的力量并且简化 SQL 的使用,并且能大量节约客户端/服务器通讯之间的开销。

客户端和服务端之间额外的传输将被取消.
客户端不需要也不用客户端和服务端之间进行封装或者传输的中间结果。
可以避免命令的多轮解析

在PL/pgSQL中编写的函数可以用服务器支持的任何标量参数或者数组类型,并且他们可以返回这些类型的任何结果。它们也能接受或者返回任何 声明的复合类型(行类型)。声明一个PL/pgSQL函数返回record函数,这意味这这个结果是一个行类型,这个行的字段是在调用它的查询中指定的。

PL/pgSQL函数能够用VARIADIC标志声明一个可变的数字参数。这个方法实际和SQL的函数是用的方法是一样的。

PL/pgSQL函数也可以声明并接受返回多态的类型anyelement, anyarray, anynonarray, 和anyenum。一个多态的函数实际操作的数据类型可以在不同的调用环境中变化。

PL/pgSQL函数也能声明并返回单个实例的任意一个数据类型集(或者表)。这样的函数通过为结果集每个需要返回的元素执行一个RETURN NEXT生成它的输出,或者用RETURN QUERY的输出来评估一个查询的结果。

最后,PL/pgSQL 函数可以声明为返回void,如果它没什么有用的值可以返回的话。

PL/pgSQL函数也能够用输出的参数来进行声明并代替一个明确的返回类型。这不会为这个语言添加任何基本的功能,但是这样常常是很方便的,特别是返回多个值的时候。这个RETURNS TABLE表示法也能用RETURNS SETOF进行替换。


我觉得虽然plpgsql是过程语言,但是pg中所编写的过程基本上都属于函数,因为关键字create function 和 returns 是固定的,而mysql中可以分开create 存储过程procedure 和函数function 两类,function 都是要明确返回类型的,那再在从上述PL/pgSQL 函数可以声明为返回void可以看出plpgsql 一样可以“模仿”完成procedure的功能扮演,是殊途同归的,只是pg上更加强调这是一种语言:PL/pgSQL,而mysql只是单纯的具备了可编写存储过程和函数这两种功能。

yun=> \dL
语言列表
名称 | 拥有者 | 信任 | 描述
---------+----------+------+------------------------------
plpgsql | postgres | t | PL/pgSQL procedural language
(1 行记录)