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 语句创建用户定义函数。