在 Azure Database for PostgreSQL 中创建和使用函数

已完成

我们已经了解到 PostgreSQL 支持不同的语言。 函数可分为四种不同类型的:

  • 用 SQL 编写的函数。
  • 过程语言函数,用受支持的过程语言(如 PL.pgSQL)编写。
  • 内部函数。
  • C 语言函数。

此外,函数的用途也可以归类为 可变不可变稳定

可变(默认)函数可以修改数据库,并且不一定每次都使用相同的输入参数返回相同的结果。 因此,每次调用此函数时,都必须重新评估它。

稳定 函数无法修改数据库,如果传递了相同的参数并在同一语句中运行,则返回相同的结果。 如果多次调用此函数,查询优化器可以使用上次调用该函数的结果。

不可变 函数不能修改数据库,如果传入相同的参数,则返回相同的结果,与调用它的查询无关。

函数的波动性对查询优化器处理函数的效率有很大的不同。

创建函数

函数返回单个值,可在 SELECT 语句中使用。

用于创建函数的语法为:

CREATE [OR REPLACE] FUNCTION
myfunction ([inputparam] type {default})
RETURNS returntype AS
$$
SQL body
$$
LANGUAGE 'language_name';
CREATE FUNCTION

与存储过程一样,$$ 符号用于启动和结束字符串。

函数采用以下参数:

  • 名称 - (可选)可包含架构名称。
  • argmode - 参数模式。 可以是 "IN"、"OUT"、"INOUT" 或 "VARIADIC"(可变参数)。 默认值为 IN。 VARDIAC 是相同类型的未定义输入参数数,,后跟 OUT 参数。 OUT 和 INOUT 参数不能与 RETURNS TABLE 表示法一起使用。
  • argname - 参数名称。
  • 参数类型 - 参数数据类型。 可以是基类型、复合类型或域类型,也可以引用表列类型。 列类型以 table_name.column_name%TYPE形式编写。 此数据类型有助于使函数与表定义更改无关。
  • t_expr - 如果未指定参数,则为默认值(同一类型)。 只有 IN 和 INOUT 参数具有默认值。 具有默认值的参数后面的输入参数还必须具有默认值。
  • 返回类型 - 返回数据类型,可以是基数据类型、复合数据类型或域类型,也可以引用表列类型。 如果函数未返回值,请将返回类型指定为 void。 如果有 OUT 或 INOUT 参数,可以省略 RETURNS 子句。 如果存在,则它必须与输出参数所隐含的结果类型一致:如果有多个输出参数,则结果类型应为RECORD,单个输出参数应与该参数的类型相同。 SETOF 修饰符指示函数返回一组项,而不是单个项。 通过编写 table_name来引用列的类型。
  • column_name - RETURNS TABLE 语法中的输出列的名称。 此参数声明了一个命名的 OUT 参数,但 RETURNS TABLE 也意味着 RETURNS SETOF。
  • column_type - RETURNS TABLE 语法中输出列的数据类型。
  • lang_name - 用于编写过程的语言。 如果指定了sql_body,则默认值为 sql。 可以是 sql、c、internal 或用户定义的过程语言的名称,例如 plpgsql。

使用关键字 IMMUTABLE、STABLE 或 VOLATILE 给查询优化器提供有关函数的提示。 VOLATILE 是默认值。

调用函数

通过将任何相关参数传递给查询,可以在查询中使用函数。 例如:

SELECT myfunction(3), CatID, CatName
    FROM myCats

内置函数

PostgreSQL 包含许多可在查询中使用的内置函数。 这些内容包括进行比较、聚合数据、数学函数等。有关 PostgreSQL 函数 的完整列表,请参阅联机文档。

内置字符串函数的一个示例是 子字符串

substring (*string* text [ FROM *start* integer ] [ FOR *count* integer ] ) → text

此函数采用三个输入参数:

  • 字符串(类型文本)
  • FROM start (类型整数)
  • FOR count (类型为整数)

子字符串返回输入文本的一部分,从 开始 字符开始,并在 计数 字符后停止。 例如:

substring('Thomas' from 2 for 3) → hom
substring('Thomas' from 3) → omas
substring('Thomas' for 2) → Th

此函数与 substr 功能相同:

substr ( *string* text, *start* integer [, *count* integer ] ) → text
substr('alphabet', 3) → phabet
substr('alphabet', 3, 2) → ph

注意

如果你熟悉函数,你会注意到第一个版本使用关键字而不是逗号来分隔参数。 PostgreSQL 提供这两个版本的函数。