Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

CREATE FUNCTION

创建新的用户定义的标量函数 (UDF)。

语法

Copy
CREATE [ OR REPLACE ] FUNCTION f_function_name ( [argument_name data_type [ , ... ] ] ) RETURNS data_type {VOLATILE | STABLE | IMMUTABLE } AS $$ python_program $$ LANGUAGE plpythonu;

参数

OR REPLACE

指定如果某个函数与已存在的此函数具有相同的名称和输入参数数据类型或签名,则替换现有的函数。您只能将某个函数替换为定义一组相同数据类型的新函数。您必须是超级用户才能替换函数。

如果您定义的函数与现有函数具有相同的名称,但签名不同,则将创建新的函数。换而言之,函数名称将会重载。有关更多信息,请参阅 重载函数名称

f_function_name

参数的名称。如果您指定 schema 名称(例如 myschema.myfunction),则使用指定的 schema 创建函数。否则,将在当前 schema 中创建该函数。有关有效名称的更多信息,请参阅名称和标识符

我们建议您在所有 UDF 名称前面加 f_ 前缀。Amazon Redshift 保留 f_ 前缀供 UDF 名称使用。因此,使用 f_ 前缀,您可以确保您的 UDF 名称不会与现有或未来的 Amazon Redshift 内置 SQL 函数名称冲突。有关更多信息,请参阅 对 UDF 命名

如果输入参数的数据类型不同,您可以定义多个具有相同函数名称的函数。换而言之,函数名称将会重载。有关更多信息,请参阅 重载函数名称

argument_name data_type

输入参数名称和数据类型的列表。UDF 可以实施任何标准的 Amazon Redshift 数据类型。此外,UDF 支持数据类型 ANYELEMENT,该数据类型会根据在运行时提供的对应参数的数据类型,自动转换为标准数据类型。如果多个参数使用 ANYELEMENT,则它们会根据列表中的第一个 ANYELEMENT 参数,在运行时全部解析为相同的数据类型。有关更多信息,请参阅 UDF 数据类型数据类型

您可以指定最多 32 个参数。

RETURNS data_type

函数返回的值的数据类型。RETURNS 数据类型可以是任何标准的 Amazon Redshift 数据类型。此外,UDF 可以使用数据类型 ANYELEMENT,该数据类型会根据在运行时提供的参数,自动转换为标准数据类型。如果您为返回数据类型指定 ANYELEMENT,则至少有一个参数必须使用 ANYELEMENT。在调用函数时,实际返回数据类型将匹配为 ANYELEMENT 参数提供的数据类型。有关更多信息,请参阅 UDF 数据类型

VOLATILE | STABLE | IMMUTABLE

通知查询优化程序有关函数的不稳定性。

如果您将函数标记为其有效的最严格稳定性类别,您将获得最大程度的优化。另一方面,如果类别过于严格,则存在优化程序错误地忽略某些调用的风险,从而导致不正确的结果集。按照严格性顺序,从最不严格的开始,稳定性类别包括:

  • VOLATILE

  • STABLE

  • IMMUTABLE

VOLATILE

对于相同的参数,函数会对连续的调用返回不同的结果,甚至对于单个语句中的行也是如此。优化查询程序无法对不稳定函数的行为做出任何假设,因此使用不稳定函数的查询必须对每个输入行重新计算该函数。

STABLE

对于相同的参数,可保证函数对在单个语句内处理的所有行返回相同的结果。在不同的语句中调用时,函数可能会返回不同的结果。此类别使优化程序能够将单个语句内对该函数的多个调用优化为对该语句的单个调用。

IMMUTABLE

对于相同的参数,函数始终返回相同的结果。当查询使用常量参数调用 IMMUTABLE 函数时,优化程序会预先计算函数。

AS $$ ... $$ LANGUAGE plpythonu

一个结构,其中包含要执行的语句,以及显示编写语句所用语言的关键字。需要文字关键字 AS $$$$ LANGUAGE plpythonu

Amazon Redshift 要求您使用称为美元引号的格式,在您的函数中包含语句。包含的任何内容将按原样传递。您不必对任何特殊字符进行转义,因为字符串的内容是按照字母编写的。

通过“美元引号”格式,您可以使用一对美元符号 ($$) 来指示要执行的语句的开头和结尾,如以下示例所示。

Copy
$$ my statement $$

(可选)在每对美元符号之间,可以指定字符串来帮助识别语句。您使用的字符串必须在括起字符对的开始和结束都是相同的。该字符串区分大小写,它遵循与不带括起字符的标识符相同的约束,但有一点除外,它不能包含美元符号。以下示例使用字符串 test

Copy
$test$ my statement $test$

有关“美元引号”格式的更多信息,请参阅 PostgreSQL 手册的词法结构部分中的使用美元符号括起的常量字符串

您在函数中传递的语句必须符合 Python 网站上的 Python 代码样式指南中规定的缩进要求。Python (plpythonu) 是唯一受支持的语言。

python_program

返回值的有效 Python 可执行程序。有关更多信息,请参阅 适用于 UDF 的 Python 语言支持

示例

以下示例创建用于比较两个整数值并返回较大值的函数:

Copy
create function f_greater (a float, b float) returns float stable as $$ if a > b: return a return b $$ language plpythonu;

以下示例查询 SALES 表并调用新的 f_greater 函数,以返回 COMMISSION 和 PRICEPAID 的 20% 这两个值中较大的值:

Copy
select f_greater (commission, pricepaid*0.20) from sales;

本页内容: