PostgreSQL 创建函数语句
在本教程中,您将学习如何使用 PostgreSQL CREATE FUNCTION 语句开发用户定义函数。
摘要:在本教程中,您将学习如何使用 PostgreSQL CREATE FUNCTION 语句开发用户定义函数。
Create Function 语句简介
该 create function 语句允许您定义一个新的用户定义函数。
下面说明了该 create function 语句的语法:
create [or replace] function function_name(param_list)
returns return_type
language plpgsql
as
$$ declare
-- variable declaration
begin
-- logic
end;
$$
在这个语法中:
- 首先,在
create function关键字后指定函数的名称。如果要替换现有函数,可以使用or replace关键字。 - 然后,指定函数名后用括号括起来的函数参数列表。一个函数可以有零个或多个参数。
- 接下来,在
returns关键字后指定返回值的数据类型。 - 之后,使用
language plpgsql来指定函数的过程语言。请注意,PostgreSQL 支持许多过程语言,而不仅仅是plpgsql. - 最后,在用美元引用的字符串常量中放置一个块。
PostgreSQL Create Function 语句示例
我们将使用来自dvdrental 示例数据库的 film 表。

以下语句创建了一个函数,用于计算 len_from 和 len_to 参数之间的电影长度:
create function get_film_count(len_from int, len_to int)
returns int
language plpgsql
as
$$ declare
film_count integer;
begin
select count(*)
into film_count
from film
where length between len_from and len_to;
return film_count;
end;
$$;
该函数 get_film_count 有两个主要部分:标题和正文。
在标题部分:
- 首先,函数名
get_film_count跟在create function关键字后面。 - 其次,该
get_film_count()函数接受两个整数数据类型的参数 len_from 和 len_to。 - 第三,
get_film_count函数返回returns int子句指定的整数。 - 最后,函数的语言
plpgsql由language plpgsql.
在函数体中:
- 使用以开头和结尾的美元引号字符串常量语法。在这些之间,您可以放置一个包含函数声明和逻辑的块。
$$$$$$ - 在声明部分,声明一个名为
film_count的变量 ,用于存储从film表中选择的电影数量。 - 在块的主体中,使用
select into语句选择长度介于len_from和之间的电影数量,len_to并将结果分配给film_count变量。在块的末尾,使用return语句返回film_count.
要执行 create function 语句,您可以使用任何 PostgreSQL 客户端工具,包括 psql 和 pgAdmin
使用 pgAdmin 创建函数
首先,启动 pgAdmin 工具并连接到dvdrental 示例数据库。
其次,通过选择Tools > Query Tool打开查询工具。
三、在查询工具中输入以上代码,点击执行按钮创建 get_film_count 函数。

如果一切正常,您将看到以下消息:
CREATE FUNCTION
Query returned successfully in 44 msec.
表示函数 get_film_count 创建成功。
最后,您可以 get_film_count 在函数列表中找到该函数:

如果找不到函数名,可以右键单击Functions 节点,选择**Refresh…**菜单项刷新函数列表。
使用 psql 创建函数
首先,启动 psql 交互工具并连接到 dvdrental 数据库。
其次,在psql中输入上面的代码来创建这样的函数:
dvdrental=# create function get_film_count(len_from int, len_to int)
dvdrental-# returns int
dvdrental-# language plpgsql
dvdrental-# as
dvdrental-# $$
dvdrental$# declare
dvdrental$# film_count integer;
dvdrental$# begin
dvdrental$# select count(*)
dvdrental$# into film_count
dvdrental$# from film
dvdrental$# where length between len_from and len_to;
dvdrental$#
dvdrental$# return film_count;
dvdrental$# end;
dvdrental$# $$;
如果函数创建成功,您将看到以下消息:
CREATE FUNCTION
三、使用 \df 命令列出当前数据库中所有用户定义的:
dvdrental=# \df
调用用户定义的函数
PostgreSQL 为您提供了三种调用用户自定义函数的方式:
- 使用位置符号
- 使用命名符号
- 使用混合符号。
使用位置符号
要使用位置表示法调用函数,您需要以与参数相同的顺序指定参数。例如:
select get_film_count(40,90);
输出:
get_film_count
----------------
325
(1 row)在这个例子中,get_film_count() 的参数是 40 和 90 对应于 from_len 和 to_len 参数。
当函数的参数很少时,您可以使用位置符号调用函数。
如果函数有很多参数,你应该使用命名符号来调用它,因为它会使函数调用更加明显。
使用命名符号
下面显示了如何 get_film_count 使用位置符号调用函数:
select get_film_count(
len_from => 40,
len_to => 90
);
输出:
get_film_count
----------------
325
(1 row)在命名表示法中,您使用 => 来分隔参数的名称和它的值。
为了向后兼容,PostgreSQL 支持基于 := 以下的旧语法:
select get_film_count(
len_from := 40,
len_to := 90
);
使用混合符号
混合符号是位置符号和命名符号的组合。例如:
select get_film_count(40, len_to => 90);
请注意,您不能在位置参数之前使用命名参数,如下所示:
select get_film_count(len_from => 40, 90);
错误:
ERROR: positional argument cannot follow named argument
LINE 1: select get_film_count(len_from => 40, 90);
在本教程中,您学习了如何使用 CREATE FUNCTION 语句创建用户定义函数。