CREATE FUNCTION
功能描述
创建新的函数。在MySQL兼容模式下,支持以下语法:
RETURNS CHARSET
RETURN(temp)
注意事项
上述功能仅在数据库兼容模式为PG时能够使用(即创建DB时DBCOMPATIBILITY='PG'),在其他数据库兼容模式下不能使用该特性。
上述功能仅在V2.2 Build 10 (Patch No.17)及以后版本支持。
指定多个特性时,排列位于后的特性生效。
特性语法小写时可识别。
语法格式
CREATE [ OR REPLACE ] [DEFINER = usr] FUNCTION function_name
( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ]} [, ...] ] )
[ RETURNS rettype [ CHARSET = charset ] [ DETERMINISTIC | PIPELINED ]
| RETURNS TABLE ( { column_name column_type } [, ...] )]
LANGUAGE lang_name
[
{IMMUTABLE | STABLE | VOLATILE}
| {SHIPPABLE | NOT SHIPPABLE}
| [ NOT ] LEAKPROOF
| WINDOW
| {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT}
| {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | AUTHID DEFINER | AUTHID CURRENT_USER}
| SQL SECURITY { DEFAULT | INVOKER }
| {FENCED | NOT FENCED}
| {PACKAGE}
| COST execution_cost
| ROWS result_rows
| SET configuration_parameter { {TO | =} value | FROM CURRENT }
| [NOT] DETERMINISTIC
] [...]
{
AS 'definition'
| AS 'obj_file', 'link_symbol'
}
CREATE [ OR REPLACE ] [DEFINER = usr] FUNCTION function_name
( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ] } [, ...] ] )
RETURN rettype [ CHARSET = charset ] [ DETERMINISTIC | PIPELINED ]
[
{IMMUTABLE | STABLE | VOLATILE }
| {SHIPPABLE | NOT SHIPPABLE}
| {PACKAGE}
| [ NOT ] LEAKPROOF
| {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }
| {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | | AUTHID DEFINER | AUTHID CURRENT_USER}
| SQL SECURITY { DEFAULT | INVOKER }
| COST execution_cost
| ROWS result_rows
| SET configuration_parameter { {TO | =} value | FROM CURRENT }
| [NOT] DETERMINISTIC
][...]
{
IS | AS
} plsql_body
/
参数说明
function_name
要创建的函数名称(可以用模式修饰)。
取值范围:字符串,要符合标识符的命名规范。且最多为63个字符。若超过63个字符,数据库会截断并保留前63个字符当做函数名称。
argname
函数参数的名称。
取值范围:字符串,要符合标识符的命名规范。且最多为63个字符。若超过63个字符,数据库会截断并保留前63个字符当做函数参数名称。
argmode
函数参数的模式。
取值范围:IN、OUT、INOUT或VARIADIC。缺省值是IN。并且OUT和INOUT模式的参数不能用在RETURNS TABLE的函数定义中。
VARIADIC用于声明数组类型的参数。
argtype
函数参数的类型。可以使用%TYPE或%ROWTYPE间接引用变量或表的类型,详细可参考函数章节定义变量。
expression
参数的默认表达式。
rettype
函数返回值的数据类型。
如果存在OUT或INOUT参数,可以省略RETURNS子句。如果存在,该子句必须和输出参数所表示的结果类型一致;如果有多个输出参数,则为RECORD,否则与单个输出参数的类型相同。
SETOF修饰词表示该函数将返回一个集合,而不是单独一项。
与argtype相同,同样可以使用%TYPE或%ROWTYPE间接引用类型。
CHARSET
函数返回的字符集。
column_name
字段名称。
column_type
字段类型。
definition
一个定义函数的字符串常量,含义取决于语言。它可以是一个内部函数名称、一个指向某个目标文件的路径、一个SQL查询、一个过程语言文本。
DETERMINISTIC
SQL语法兼容接口,未实现功能,不推荐使用。
LANGUAGE lang_name
用以实现函数的语言的名称。可以是SQL、internal或者是用户定义的过程语言名称。为了保证向下兼容,该名称可以用单引号包围。若采用单引号,则引号内必须为小写。
WINDOW
表示该函数是窗口函数。替换函数定义时不能改变WINDOW属性。
自定义窗口函数只支持LANGUAGE是internal,并且引用的内部函数必须是窗口函数。
IMMUTABLE
表示该函数在给出同样的参数值时总是返回同样的结果。
STABLE
表示该函数不能修改数据库,对相同参数值,在同一次表扫描里,该函数的返回值不变,但是返回值可能在不同SQL语句之间变化。
VOLATILE
表示该函数值可以在一次表扫描内改变,因此不会做任何优化。
SHIPPABLE|NOT SHIPPABLE
表示该函数是否可以下推执行。预留接口,不推荐使用。
FENCED|NOT FENCED
声明用户定义的C函数是在保护模式还是非保护模式下执行。预留接口,不推荐使用。
PACKAGE
表示该函数是否支持重载。PostgreSQL风格的函数本身就支持重载,此参数主要是针对其它风格的函数。
- 不允许package函数和非package函数重载或者替换。
- package函数不支持VARIADIC类型的参数。
- 不允许修改函数的package属性。
LEAKPROOF
指出该函数的参数只包括返回值。LEAKPROOF只能由系统管理员设置。
CALLED ON NULL INPUT
表明该函数的某些参数是NULL的时候可以按照正常的方式调用。该参数可以省略。
RETURNS NULL ON NULL INPUT
STRICT
STRICT用于指定如果函数的某个参数是NULL,此函数总是返回NULL。如果声明了这个参数,当有NULL值参数时该函数不会被执行;而只是自动返回一个NULL结果。
RETURNS NULL ON NULL INPUT和STRICT的功能相同。
EXTERNAL
目的是和SQL兼容,是可选的,这个特性适合于所有函数,而不仅是外部函数。
SECURITY INVOKER
AUTHID CURRENT_USER
表明该函数将带着调用它的用户的权限执行。该参数可以省略。
SECURITY INVOKER和AUTHID CURRENT_USER的功能相同。
SECURITY DEFINER
AUTHID DEFINER
声明该函数将以创建它的用户的权限执行。
AUTHID DEFINER和SECURITY DEFINER的功能相同。
COST execution_cost
用来估计函数的执行成本。
execution_cost以cpu_operator_cost为单位。
取值范围:正数
ROWS result_rows
当函数返回值是一个集合时,估计函数返回的行数。
取值范围:正数,默认值是1000行。
configuration_parameter
value
把指定的数据库会话参数值设置为给定的值。如果value是DEFAULT或者RESET,则在新的会话中使用系统的缺省设置。OFF关闭设置。
取值范围:字符串
- DEFAULT
- OFF
- RESET
指定默认值。
from current
取当前会话中的值设置为configuration_parameter的值。
[NOT] DETERMINISTIC
说明函数执行的结果是否为确定值。
- DETERMINISTIC:表示结果确定。每次执行函数时,相同的输入会得到相同的输出。
- NOT DETERMINISTIC:表示结果不确定,相同的输入可能得到不同的输出。
plsql_body
PL/SQL存储过程体。
当在函数体中进行创建用户等涉及用户密码相关操作时,系统表及csv日志中会记录密码的明文。因此不建议用户在函数体中进行涉及用户密码的相关操作。
示例
示例1: 使用RETURNS CHARSET和RETURN ()语法创建函数。
1、创建函数。
CREATE OR REPLACE FUNCTION int1_function() RETURNS INT charset utf8mb4 RETURN (ABS(-5));
2、执行函数验证结果。
SELECT int1_function();
返回结果为:
int1_function --------------- 5 (1 row)
3、清理测试函数。
DROP FUNCTION int1_function();