首页 > 数据库 > > SQL语法-CREATE FUNCTION
创建一个函数。
CREATE [ OR REPLACE ] FUNCTION function_name
( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ]} [, ...] ] )
[ RETURNS rettype [ DETERMINISTIC ] | RETURNS TABLE ( { column_name column_type } [, ...] )]
LANGUAGE lang_name
[
{IMMUTABLE | STABLE | VOLATILE }
| {SHIPPABLE | NOT SHIPPABLE}
| WINDOW
| [ NOT ] LEAKPROOF
| {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }
| {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | AUTHID DEFINER | AUTHID CURRENT_USER}
| {fenced | not fenced}
| {PACKAGE}
| COST execution_cost
| ROWS result_rows
| SET configuration_parameter { {TO | =} value | FROM CURRENT }}
][...]
{
AS 'definition'
| AS 'obj_file', 'link_symbol'
}
CREATE [ OR REPLACE ] FUNCTION function_name
( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ] } [, ...] ] )
RETURN rettype [ DETERMINISTIC ]
[
{IMMUTABLE | STABLE | VOLATILE }
| {SHIPPABLE | NOT SHIPPABLE}
| {PACKAGE}
| {FENCED | NOT FENCED}
| [ NOT ] LEAKPROOF
| {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }
| {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER |
AUTHID DEFINER | AUTHID CURRENT_USER
}
| COST execution_cost
| ROWS result_rows
| SET configuration_parameter { {TO | =} value | FROM CURRENT
][...]
{
IS | AS
} plsql_body
/
要创建的函数名字(可以用模式修饰)。
取值范围:字符串,要符合标识符的命名规范。
函数参数的名字。
取值范围:字符串,要符合标识符的命名规范。
函数参数的模式。
取值范围:IN,OUT,INOUT或VARIADIC。缺省值是IN。只有OUT模式的参数后面能跟VARIADIC。并且OUT和INOUT模式的参数不能用在RETURNS TABLE的函数定义中。
说明:VARIADIC用于声明数组类型的参数。
函数参数的类型。
参数的默认表达式。
函数返回值的数据类型。
如果存在OUT或IN OUT参数,可以省略RETURNS子句。如果存在,该子句必须和输出参数所表示的结果类型一致:如果有多个输出参数,则为RECORD,否则与单个输出参数的类型相同。
SETOF修饰词表示该函数将返回一个集合,而不是单独一项。
为适配oracle SQL语法,未实现功能,不推荐使用。
字段名称。
字段类型。
一个定义函数的字符串常量,含义取决于语言。它可以是一个内部函数名字、一个指向某个目标文件的路径、一个SQL查询、一个过程语言文本。
用以实现函数的语言的名字。可以是SQL,C,internal,或者是用户定义的过程语言名字。为了保证向下兼容,该名字可以用单引号(包围)。若采用单引号,则引号内必须为大写。
表示该函数是窗口函数,通常只用于C语言编写的函数。替换函数定义时不能改变WINDOW属性。

自定义窗口函数只支持LANGUAGE是internal,并且引用的内部函数必须是窗口函数。
表示该函数在给出同样的参数值时总是返回同样的结果。
表示该函数不能修改数据库,对相同参数值,在同一次表扫描里,该函数的返回值不变,但是返回值可能在不同SQL语句之间变化。
表示该函数值可以在一次表扫描内改变,因此不会做任何优化。
NOT SHIPPABLE
表示该函数是否可以下推到DN上执行。
指出该函数的参数只包括返回值。LEAKPROOF只能由系统管理员设置。
表明该函数的某些参数是NULL的时候可以按照正常的方式调用。该参数可以省略。
STRICT
STRICT用于指定如果函数的某个参数是NULL,此函数总是返回NULL。如果声明了这个参数,当有NULL值参数时该函数不会被执行;而只是自动返回一个NULL结果。
RETURNS NULL ON NULL INPUT和STRICT的功能相同。
目的是和SQL兼容,是可选的,这个特性适合于所有函数,而不仅是外部函数。
AUTHID CURRENT_USER
表明该函数将带着调用它的用户的权限执行。该参数可以省略。
SECURITY INVOKER和AUTHID CURRENT_USER的功能相同。
AUTHID DEFINER
声明该函数将以创建它的用户的权限执行。
AUTHID DEFINER和SECURITY DEFINER的功能相同。
NOT FENCED
该函数只对用户定义的C函数生效,声明函数是在保护模式还是非保护模式下执行。如果函数声明为NOT FENCED模式,则函数的执行在CN或者DN进程中进行。如果函数声明为FENCED模式,则函数在新fork的进程执行,这样函数的异常不会影响CN或者DN进程。
FENCED/NOT FENCED模式的选择:
用来估计函数的执行成本。
execution_cost以cpu_operator_cost为单位。
取值范围:正数
估计函数返回的行数。用于函数返回的是一个集合。
取值范围:正数,默认值是1000行。
把指定的数据库会话参数值设置为给定的值。如果value是DEFAULT或者RESET,则在新的会话中使用系统的缺省设置。OFF关闭设置。
取值范围:字符串
指定默认值。
取当前会话中的值设置为configuration_parameter的值。
适用于C语言函数,字符串obj_file指定了动态库的绝对路径;link_symbol 指定了该函数的链接符号,也就是该函数在C代码中的函数名称。
PL/SQL存储过程体。

当在函数体中创建用户时,日志中会记录密码的明文。因此不建议用户在函数体中创建用户。
--定义函数为SQL查询。
CREATE FUNCTION func_add_sql(integer, integer) RETURNS integer
AS 'select $1 + $2;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;
--利用参数名用 PL/pgSQL 自增一个整数。
CREATE OR REPLACE FUNCTION func_increment_plsql(i integer) RETURNS integer AS $$
BEGIN
RETURN i + 1;
END;
$$ LANGUAGE plpgsql;
--返回RECORD类型
CREATE OR REPLACE FUNCTION compute(i int, out result_1 bigint, out result_2 bigint)
returns SETOF RECORD
as $$
begin
result_1 = i + 1;
result_2 = i * 10;
return next;
end;
$$language plpgsql;
--返回一个包含多个输出参数的记录。
CREATE FUNCTION func_dup_sql(in int, out f1 int, out f2 text)
AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
LANGUAGE SQL;
SELECT * FROM func_dup_sql(42);
--计算两个整数的和,并返回结果。若果输入为null,则返回null。
CREATE FUNCTION func_add_sql2(num1 integer, num2 integer) RETURN integer
AS
BEGIN
RETURN num1 + num2;
END;
/
--创建package属性的重载函数
create or replace function package_func_overload(col int, col2 int)
return integer package
as
declare
col_type text;
begin
col := 122;
dbms_output.put_line('two int parameters ' || col2);
return 0;
end;
/
create or replace function package_func_overload(col int, col2 smallint)
return integer package
as
declare
col_type text;
begin
col := 122;
dbms_output.put_line('two smallint parameters ' || col2);
return ;
end;
/
--修改函数add的执行规则为IMMUTABLE,即参数不变时返回相同结果。
ALTER FUNCTION func_add_sql2(INTEGER, INTEGER) IMMUTABLE;
--将函数add的名称修改为add_two_number。
ALTER FUNCTION func_add_sql2(INTEGER, INTEGER) RENAME TO add_two_number;
--将函数add的属者改为omm。
ALTER FUNCTION add_two_number(INTEGER, INTEGER) OWNER TO omm;
--删除函数。
DROP FUNCTION add_two_number;
DROP FUNCTION func_increment_sql;
DROP FUNCTION func_dup_sql;
DROP FUNCTION func_increment_plsql;
DROP FUNCTION func_add_sql;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69959250/viewspace-3152593/ ,如需转载,请注明出处,否则将追究法律责任。