PostgreSQL 支持创建自定义函数,相比于 SQL 对表进行简单增删改查操作,自定义函数能够实现各种复杂的逻辑。PostgreSQL 自定义函数支持的语法主要包括 SQL,plsql,C语言函数等。
1. 创建函数的语法
CREATE [ OR REPLACE ] FUNCTION
name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ] )
[ RETURNS rettype
| RETURNS TABLE ( column_name column_type [, ...] ) ]
{ LANGUAGE lang_name
| TRANSFORM { FOR TYPE type_name } [, ... ]
| WINDOW
| { IMMUTABLE | STABLE | VOLATILE }
| [ NOT ] LEAKPROOF
| { CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }
| { [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER }
| PARALLEL { UNSAFE | RESTRICTED | SAFE }
| COST execution_cost
| ROWS result_rows
| SUPPORT support_function
| SET configuration_parameter { TO value | = value | FROM CURRENT }
| AS 'definition'
| AS 'obj_file', 'link_symbol'
} ...
2. 创建 SQL 类型的函数
下面的示例是创建一个名为 myadd 的函数,开发语言为 SQL,功能是实现两个整数相加,计算相加后的结果并返回。
CREATE FUNCTION myadd(integer, integer) RETURNS integer
AS 'select $1 + $2;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;
调用函数:
postgres=# select * from myadd(10,20);
myadd
-------
30
(1 row)
3. 创建 plsql 类型的函数
下面示例是创建一个名为 myincrement 的函数,开发语言为 plsql,功能是实现一个整数自增,并将自增后的结果返回。
CREATE OR REPLACE FUNCTION myincrement(i integer) RETURNS integer AS $$
BEGIN
RETURN i + 1;
END;
$$ LANGUAGE plpgsql;
调用函数:
postgres=# select * from myincrement(10);
myincrement
-------------
11
4. 创建一个返回 2 个字段的函数
下面这个创建一个名为 mydum 的函数,开发语言为 SQL,入参为一个整数,返回结果是一个包含 2 个字段的表记录,如下:
CREATE FUNCTION mydup(int) RETURNS TABLE(f1 int, f2 text)
AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
LANGUAGE SQL;
调用函数:
postgres=# select mydup(10);
mydup
-------------------
(10,"10 is text")
(1 row)
5. 删除函数
drop function myincrement;
drop function myadd;
drop function if exists mydup;
更多函数相关语法,请参考链接:
https://www.postgresql.org/docs/13/sql-createfunction.html