这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

CREATE FUNCTION 语句

Vertica 为每种类型的用户定义的扩展提供 CREATE 语句。每个 CREATE 语句都会向 Vertica 编录添加一个用户定义的函数:

Vertica 还提供 CREATE FUNCTION (SQL),它将 SQL 表达式存储为您可以在查询中调用的函数。

1 - CREATE AGGREGATE FUNCTION

向编录添加用户定义的聚合函数 (UDAF)。包含该函数的库必须先前已使用 CREATE LIBRARY 添加。

CREATE AGGREGATE FUNCTION 根据工厂类提供的数据自动确定函数参数和返回值。Vertica 支持重载聚合函数。当您调用 SQL 函数时,Vertica 会将输入表传递给该函数进行处理。

语法

CREATE [ OR REPLACE ] AGGREGATE FUNCTION [ IF NOT EXISTS ]
  [[database.]schema.]function AS
  [ LANGUAGE 'language' ]
  NAME 'factory'
  LIBRARY library
  [ FENCED | NOT FENCED ]

参数

OR REPLACE

如果存在具有相同名称和实参的函数,则会替换它。例如,您可以使用它在围栏模式和非围栏模式之间进行切换。如果您不使用此指令并且该函数已存在,则 CREATE 语句将返回一个回退错误。

OR REPLACE 和 IF NOT EXISTS 是互斥的。

IF NOT EXISTS

如果存在具有相同名称和实参的函数,则会返回该函数而不会创建它。

OR REPLACE 和 IF NOT EXISTS 是互斥的。

[database.]schema

数据库和架构。默认架构为 public。如果指定一个数据库,它必须是当前数据库。

function

要创建的函数的名称。该名称用于函数的 SQL 调用。它不需要匹配工厂名称,但是如果这两个名称相同或相似,可以减少困惑。

函数名必须符合标识符的限制。

LANGUAGE 'language'
用于开发此函数的语言,目前仅 C++(默认)。
NAME 'factory'
生成函数实例的工厂类的名称。
LIBRARY library
包含函数的共享库的名称。此库必须已由 CREATE LIBRARY 加载。
FENCED | NOT FENCED
启用或禁用此函数的隔离模式

默认值: FENCED

特权

非超级用户:

  • 函数架构的 CREATE 权限

  • 函数库的 USAGE 权限

示例

以下示例演示了加载名为 AggregateFunctions 的库,然后定义名为 ag_avgag_cat 的函数。这些函数映射到库中的 AverageFactoryConcatenateFactory 类:

=> CREATE LIBRARY AggregateFunctions AS '/opt/vertica/sdk/examples/build/AggregateFunctions.so';
CREATE LIBRARY
=> CREATE AGGREGATE FUNCTION ag_avg AS LANGUAGE 'C++' NAME 'AverageFactory'
   library AggregateFunctions;
CREATE AGGREGATE FUNCTION
=> CREATE AGGREGATE FUNCTION ag_cat AS LANGUAGE 'C++' NAME 'ConcatenateFactory'
   library AggregateFunctions;
CREATE AGGREGATE FUNCTION
=> \x
Expanded display is on.
select * from user_functions;
-[ RECORD 1 ]----------+------------------------------------------------------------------
schema_name            | public
function_name          | ag_avg
procedure_type         | User Defined Aggregate
function_return_type   | Numeric
function_argument_type | Numeric
function_definition    | Class 'AverageFactory' in Library 'public.AggregateFunctions'
volatility             |
is_strict              | f
is_fenced              | f
comment                |
-[ RECORD 2 ]----------+------------------------------------------------------------------
schema_name            | public
function_name          | ag_cat
procedure_type         | User Defined Aggregate
function_return_type   | Varchar
function_argument_type | Varchar
function_definition    | Class 'ConcatenateFactory' in Library 'public.AggregateFunctions'
volatility             |
is_strict              | f
is_fenced              | f
comment                |

另请参阅

2 - CREATE ANALYTIC FUNCTION

向编录添加用户定义的分析函数 (UDAnF)。包含该函数的库必须先前已使用 CREATE LIBRARY 添加。

CREATE ANALYTIC FUNCTION 根据工厂类提供的数据自动确定函数参数和返回值。Vertica 支持重载分析函数。当您调用 SQL 函数时,Vertica 会将输入表传递给库中的函数进行处理。

语法

CREATE [ OR REPLACE ] ANALYTIC FUNCTION [ IF NOT EXISTS ]
    [[database.]schema.]function AS
    [ LANGUAGE 'language' ]
    NAME 'factory'
    LIBRARY library
    [ FENCED | NOT FENCED ]

参数

OR REPLACE

如果存在具有相同名称和实参的函数,则会替换它。例如,您可以使用它在围栏模式和非围栏模式之间进行切换。如果您不使用此指令并且该函数已存在,则 CREATE 语句将返回一个回退错误。

OR REPLACE 和 IF NOT EXISTS 是互斥的。

IF NOT EXISTS

如果存在具有相同名称和实参的函数,则会返回该函数而不会创建它。

OR REPLACE 和 IF NOT EXISTS 是互斥的。

[database.]schema

数据库和架构。默认架构为 public。如果指定一个数据库,它必须是当前数据库。

function

要创建的函数的名称。该名称用于函数的 SQL 调用。它不需要匹配工厂名称,但是如果这两个名称相同或相似,可以减少困惑。

函数名必须符合标识符的限制。

LANGUAGE 'language'
用于开发此函数的语言,为以下语言之一:
  • C++ (默认值)

  • Java

NAME 'factory'
生成函数实例的工厂类的名称。
LIBRARY library
包含函数的库的名称。此库必须已由 CREATE LIBRARY 加载。
FENCED | NOT FENCED
启用或禁用此函数的隔离模式

默认值: FENCED

特权

非超级用户:

  • 函数架构的 CREATE 权限

  • 函数库的 USAGE 权限

示例

此示例基于 AnalyticFunctions 库中名为 RankFactory 的工厂类创建名为 an_rank 的分析函数:

=> CREATE ANALYTIC FUNCTION an_rank AS LANGUAGE 'C++'
   NAME 'RankFactory' LIBRARY AnalyticFunctions;

另请参阅

分析函数 (UDAnF)

3 - CREATE FILTER

向编录添加用户定义的加载筛选函数。包含筛选函数的库必须先前已使用 CREATE LIBRARY 添加。

CREATE FILTER 根据工厂类提供的数据自动确定函数参数和返回值。Vertica 支持重载负载筛选函数。当您调用 SQL 函数时,Vertica 会将输入表传递给库中的函数进行处理。

语法

CREATE [ OR REPLACE ] FILTER [ IF NOT EXISTS ]
   [[database.]schema.]function AS
   [ LANGUAGE 'language' ]
   NAME 'factory' LIBRARY library
   [ FENCED | NOT FENCED ]

参数

OR REPLACE

如果存在具有相同名称和实参的函数,则会替换它。例如,您可以使用它在围栏模式和非围栏模式之间进行切换。如果您不使用此指令并且该函数已存在,则 CREATE 语句将返回一个回退错误。

OR REPLACE 和 IF NOT EXISTS 是互斥的。

IF NOT EXISTS

如果存在具有相同名称和实参的函数,则会返回该函数而不会创建它。

OR REPLACE 和 IF NOT EXISTS 是互斥的。

[database.]schema

数据库和架构。默认架构为 public。如果指定一个数据库,它必须是当前数据库。

function

要创建的函数的名称。该名称用于函数的 SQL 调用。它不需要匹配工厂名称,但是如果这两个名称相同或相似,可以减少困惑。

函数名必须符合标识符的限制。

LANGUAGE 'language'
用于开发此函数的语言,为以下语言之一:
  • C++ (默认值)

  • Java

  • Python

NAME 'factory'
生成函数实例的工厂类的名称。 此名称与 RegisterFactory 类使用的名称相同。
LIBRARY library
C++ 库共享对象文件、Python 文件或 Java Jar 文件的名称。此库必须已由 CREATE LIBRARY 加载。
FENCED | NOT FENCED
启用或禁用此函数的隔离模式

默认值: FENCED

特权

超级用户

示例

以下示例演示了如何加载名为 iConverterLib 的库,然后定义了名为 Iconverter 的筛选函数,该函数映射到库中的 iConverterFactory 工厂类:

=> CREATE LIBRARY iConverterLib as '/opt/vertica/sdk/examples/build/IconverterLib.so';
CREATE LIBRARY
=> CREATE FILTER Iconverter AS LANGUAGE 'C++' NAME 'IconverterFactory' LIBRARY IconverterLib;
CREATE FILTER FUNCTION
=> \x
Expanded display is on.
=> SELECT * FROM user_functions;
-[ RECORD 1 ]----------+--------------------
schema_name            | public
function_name          | Iconverter
procedure_type         | User Defined Filter
function_return_type   |
function_argument_type |
function_definition    |
volatility             |
is_strict              | f
is_fenced              | f
comment                |

另请参阅

4 - CREATE FUNCTION (SQL)

将 SQL 表达式存储为函数,以在查询中使用。用户定义的 SQL 函数对于执行复杂的查询和组合 Vertica 内置函数很有用。您只需在给定查询中调用该函数。如果搜索路径中存在多个具有相同名称和实参类型的 SQL 函数,Vertica 将调用它找到的第一个匹配项。

SQL 函数在所有情况下都被修整,包括 DDL。

语法

CREATE [ OR REPLACE ] FUNCTION [ IF NOT EXISTS ]
    [[database.]schema.]function( [ arg_list ] )
    RETURN return_type
    AS
    BEGIN
       RETURN expression;
    END;

参数

OR REPLACE
如果存在相同名称和实参的函数,请将其替换。如果您只更改函数实参,Vertica 会忽略此选项并使用相同的名称保留这两个函数。

OR REPLACE 和 IF NOT EXISTS 是互斥的。

IF NOT EXISTS

如果存在具有相同名称和实参的函数,则会返回该函数而不会创建它。

OR REPLACE 和 IF NOT EXISTS 是互斥的。

[database.]schema

数据库和架构。默认架构为 public。如果指定一个数据库,它必须是当前数据库。

function
要创建的 SQL 函数,其中 function 符合标识符中描述的约定。
arg_list
实参名称及其数据类型的逗号分隔列表,按以下格式指定:
argname argtype[,...]

其中:

  • argname 为传递给 function 的实参的名称。

  • argtypeargname数据类型

return_type
此函数返回的数据类型。
RETURN 表达式
SQL 函数主体,其中 expression 可能包含 CREATE FUNCTION 语句中指定的内置函数、运算符和实参名称。

表达式末尾的分号是必需的。

特权

非超级用户:

  • 函数架构的 CREATE 权限

  • 函数库的 USAGE 权限

严格性和可变性

Vertica 根据 SQL 函数的定义推断该函数的 严格性和可变性( 稳定不可变易变)。然后,Vertica 确定使用是否正确,例如期待不可变函数却提供了易变函数的情况。

SQL 函数和视图

可以在使用 SQL 函数的查询中创建视图,然后查询这些视图。创建视图时,SQL 函数会将对用户定义的函数的调用替换为视图定义中的函数主体。因此,当用户定义的函数的主体被替换后,视图也应被替换。

示例

请参阅创建用户定义的 SQL 函数

另请参阅

5 - CREATE FUNCTION(标量)

向编录添加用户定义的标量函数 (UDSF)。包含该函数的库必须先前已使用 CREATE LIBRARY 添加。

UDSF 接受单个数据行并返回单个值。只要可以使用原生 Vertica 函数或语句(CREATE TABLE 及其 PARTITION BY 或任何分段子句除外),便可以使用这些函数。

CREATE FUNCTION 根据工厂类提供的数据自动确定函数参数和返回值。Vertica 支持重载 UDx。当您调用函数时,Vertica 会将参数传递给库中的函数进行处理。

语法

CREATE [ OR REPLACE ] FUNCTION [ IF NOT EXISTS ]
   [[database.]schema.]function AS
   [ LANGUAGE 'language' ]
   NAME 'factory'
   LIBRARY library
   [ FENCED | NOT FENCED ]

参数

OR REPLACE

如果存在具有相同名称和实参的函数,则会替换它。例如,您可以使用它在围栏模式和非围栏模式之间进行切换。如果您不使用此指令并且该函数已存在,则 CREATE 语句将返回一个回退错误。

OR REPLACE 和 IF NOT EXISTS 是互斥的。

IF NOT EXISTS

如果存在具有相同名称和实参的函数,则会返回该函数而不会创建它。

OR REPLACE 和 IF NOT EXISTS 是互斥的。

[database.]schema

数据库和架构。默认架构为 public。如果指定一个数据库,它必须是当前数据库。

function

要创建的函数的名称。该名称用于函数的 SQL 调用。它不需要匹配工厂名称,但是如果这两个名称相同或相似,可以减少困惑。

函数名必须符合标识符的限制。

LANGUAGE 'language'
用于开发此函数的语言,为以下语言之一:
  • C++ (默认值)

  • Python

  • Java

  • R

NAME 'factory'
生成函数实例的工厂类的名称。
LIBRARY library
C++ 共享对象文件、Python 文件、Java Jar 文件或 R 函数文件的名称。此库必须已由 CREATE LIBRARY 加载。
FENCED | NOT FENCED
启用或禁用此函数的隔离模式。以 Java 编写的函数和 R 函数始终在隔离模式下运行。

默认值: FENCED

特权

  • 函数架构的 CREATE 权限

  • 函数库的 USAGE 权限

示例

以下示例加载了名为 ScalarFunctions 的库,然后定义了名为 Add2ints 的函数,该函数映射到库中的 Add2intsInfo 工厂类:

=> CREATE LIBRARY ScalarFunctions AS '/opt/vertica/sdk/examples/build/ScalarFunctions.so';
CREATE LIBRARY
=> CREATE FUNCTION Add2Ints AS LANGUAGE 'C++' NAME 'Add2IntsFactory' LIBRARY ScalarFunctions;
CREATE FUNCTION
=> \x
Expanded display is on.
=> SELECT * FROM USER_FUNCTIONS;

-[ RECORD 1 ]----------+----------------------------------------------------
schema_name            | public
function_name          | Add2Ints
procedure_type         | User Defined Function
function_return_type   | Integer
function_argument_type | Integer, Integer
function_definition    | Class 'Add2IntsFactory' in Library 'public.ScalarFunctions'
volatility             | volatile
is_strict              | f
is_fenced              | t
comment                |

=> \x
Expanded display is off.
=> -- Try a simple call to the function
=> SELECT Add2Ints(23,19);
 Add2Ints
----------
       42
(1 row)

以下示例使用了返回 ROW 的标量函数:

=> CREATE FUNCTION div_with_rem AS LANGUAGE 'C++' NAME 'DivFactory' LIBRARY ScalarFunctions;

=> SELECT div_with_rem(18,5);
        div_with_rem
------------------------------
 {"quotient":3,"remainder":3}
(1 row)

另请参阅

开发用户定义的扩展 (UDx)

6 - CREATE PARSER

向编录添加用户定义的加载解析器函数。包含该函数的库必须先前已使用 CREATE LIBRARY 添加。

CREATE PARSER 根据工厂类提供的数据自动确定函数参数和返回值。Vertica 支持重载负载解析器函数。当您调用 SQL 函数时,Vertica 会将输入表传递给库中的函数进行处理。

语法

CREATE [ OR REPLACE ] PARSER [ IF NOT EXISTS ]
   [[database.]schema.]function AS
   [ LANGUAGE 'language' ]
   NAME 'factory'
   LIBRARY library
   [ FENCED | NOT FENCED ]

参数

OR REPLACE

如果存在具有相同名称和实参的函数,则会替换它。例如,您可以使用它在围栏模式和非围栏模式之间进行切换。如果您不使用此指令并且该函数已存在,则 CREATE 语句将返回一个回退错误。

OR REPLACE 和 IF NOT EXISTS 是互斥的。

IF NOT EXISTS

如果存在具有相同名称和实参的函数,则会返回该函数而不会创建它。

OR REPLACE 和 IF NOT EXISTS 是互斥的。

[database.]schema

数据库和架构。默认架构为 public。如果指定一个数据库,它必须是当前数据库。

function

要创建的函数的名称。该名称用于函数的 SQL 调用。它不需要匹配工厂名称,但是如果这两个名称相同或相似,可以减少困惑。

函数名必须符合标识符的限制。

LANGUAGE 'language'
用于开发此函数的语言,为以下语言之一:
  • C++(默认)

  • Java

  • Python

NAME 'factory'
生成函数实例的工厂类的名称。 此名称与 RegisterFactory 类使用的名称相同。
LIBRARY library
C++ 库共享对象文件、Python 文件或 Java Jar 文件的名称。此库必须已由 CREATE LIBRARY 加载。
FENCED | NOT FENCED
启用或禁用此函数的隔离模式

默认值: FENCED

特权

超级用户

示例

以下示例演示了如何加载名为 BasicIntegrerParserLib 的库,然后定义了名为 BasicIntegerParser 的解析器函数,该函数映射到库中的 BasicIntegerParserFactory 工厂类:

=> CREATE LIBRARY BasicIntegerParserLib as '/opt/vertica/sdk/examples/build/BasicIntegerParser.so';
CREATE LIBRARY
=> CREATE PARSER BasicIntegerParser AS LANGUAGE 'C++' NAME 'BasicIntegerParserFactory' LIBRARY BasicIntegerParserLib;
CREATE PARSER FUNCTION
=> \x
Expanded display is on.
=> SELECT * FROM user_functions;
-[ RECORD 1 ]----------+--------------------
schema_name            | public
function_name          | BasicIntegerParser
procedure_type         | User Defined Parser
function_return_type   |
function_argument_type |
function_definition    |
volatility             |
is_strict              | f
is_fenced              | f
comment                |

另请参阅

7 - CREATE SOURCE

向编录添加用户定义的负载源函数。包含该函数的库必须先前已使用 CREATE LIBRARY 添加。

CREATE SOURCE 根据工厂类提供的数据自动确定函数参数和返回值。Vertica 支持重载负载源函数。当您调用 SQL 函数时,Vertica 会将输入表传递给库中的函数进行处理。

语法

CREATE [ OR REPLACE ] SOURCE [ IF NOT EXISTS ]
    [[database.]schema.]function AS
    [ LANGUAGE 'language' ]
    NAME 'factory'
    LIBRARY library
    [ FENCED | NOT FENCED ]

参数

OR REPLACE

如果存在具有相同名称和实参的函数,则会替换它。例如,您可以使用它在围栏模式和非围栏模式之间进行切换。如果您不使用此指令并且该函数已存在,则 CREATE 语句将返回一个回退错误。

OR REPLACE 和 IF NOT EXISTS 是互斥的。

IF NOT EXISTS

如果存在具有相同名称和实参的函数,则会返回该函数而不会创建它。

OR REPLACE 和 IF NOT EXISTS 是互斥的。

[database.]schema

数据库和架构。默认架构为 public。如果指定一个数据库,它必须是当前数据库。

function

要创建的函数的名称。该名称用于函数的 SQL 调用。它不需要匹配工厂名称,但是如果这两个名称相同或相似,可以减少困惑。

函数名必须符合标识符的限制。

LANGUAGE 'language'
用于开发此函数的语言,为以下语言之一:
  • C++(默认)

  • Java

NAME 'factory'
生成函数实例的工厂类的名称。 此名称与 RegisterFactory 类使用的名称相同。
LIBRARY library
C++ 库共享对象文件或 Java Jar 文件的名称。此库必须已由 CREATE LIBRARY 加载。
FENCED | NOT FENCED
启用或禁用此函数的隔离模式

默认: FENCED

特权

超级用户

示例

以下示例演示了如何加载名为 curllib 的库,然后定义了名为 curl 的源函数,该函数映射到库中的 CurlSourceFactory 工厂类:

=> CREATE LIBRARY curllib as '/opt/vertica/sdk/examples/build/cURLLib.so';
CREATE LIBRARY
=> CREATE SOURCE curl AS LANGUAGE 'C++' NAME 'CurlSourceFactory' LIBRARY curllib;
CREATE SOURCE
=> \x
Expanded display is on.
=> SELECT * FROM user_functions;
-[ RECORD 1 ]----------+--------------------
schema_name            | public
function_name          | curl
procedure_type         | User Defined Source
function_return_type   |
function_argument_type |
function_definition    |
volatility             |
is_strict              | f
is_fenced              | f
comment                |

另请参阅

8 - CREATE TRANSFORM FUNCTION

向编录添加用户定义的转换函数 (UDTF)。包含该函数的库必须先前已使用 CREATE LIBRARY 添加。

CREATE TRANSFORM FUNCTION 根据工厂类提供的数据自动确定函数参数和返回值。Vertica 支持重载转换函数。当您调用 SQL 函数时,Vertica 会将输入表传递给库中的转换函数进行处理。

语法

CREATE [ OR REPLACE ] TRANSFORM FUNCTION [ IF NOT EXISTS ]
    [[database.]schema.]function AS
    [ LANGUAGE 'language' ]
    NAME 'factory'
    LIBRARY library
    [ FENCED | NOT FENCED ]

参数

OR REPLACE

如果存在具有相同名称和实参的函数,则会替换它。例如,您可以使用它在围栏模式和非围栏模式之间进行切换。如果您不使用此指令并且该函数已存在,则 CREATE 语句将返回一个回退错误。

OR REPLACE 和 IF NOT EXISTS 是互斥的。

IF NOT EXISTS

如果存在具有相同名称和实参的函数,则会返回该函数而不会创建它。

OR REPLACE 和 IF NOT EXISTS 是互斥的。

[database.]schema

数据库和架构。默认架构为 public。如果指定一个数据库,它必须是当前数据库。

function

要创建的函数的名称。该名称用于函数的 SQL 调用。它不需要匹配工厂名称,但是如果这两个名称相同或相似,可以减少困惑。

函数名必须符合标识符的限制。

LANGUAGE 'language'
用于开发此函数的语言,为以下语言之一:
  • C++ (默认值)

  • Java

  • R

  • Python

NAME 'factory'
生成函数实例的工厂类的名称。
LIBRARY library
C++ 共享对象文件、Python 文件、Java Jar 文件或 R 函数文件的名称。此库必须已由 CREATE LIBRARY 加载。
FENCED | NOT FENCED
启用或禁用此函数的隔离模式。以 Java 编写的函数和 R 函数始终在隔离模式下运行。

默认值: FENCED

特权

非超级用户:

  • 函数架构的 CREATE 权限

  • 函数库的 USAGE 权限

限制

包括 UDTF 的查询不能:

示例

以下示例加载了名为 TransformFunctions 的库,然后定义了名为 tokenize 的函数,该函数映射到库中的 TokenFactory 工厂类:

=> CREATE LIBRARY TransformFunctions AS
   '/home/dbadmin/TransformFunctions.so';
CREATE LIBRARY
=> CREATE TRANSFORM FUNCTION tokenize
   AS LANGUAGE 'C++' NAME 'TokenFactory' LIBRARY TransformFunctions;
CREATE TRANSFORM FUNCTION

另请参阅