在 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 提供这两个版本的函数。