CREATE FUNCTION
功能描述
CREATE FUNCTION 语句用于在当前 schema 或其他指定 schema 下创建函数。函数是一段可以接收参数并返回单个值的 PL/SQL 程序单元,可在 SQL 表达式或其他 PL/SQL 程序单元中调用。
注意事项
- 权限要求:在当前 schema 下创建函数需要 CREATE PROCEDURE 系统权限;在其他用户 schema 下创建需要 CREATE ANY PROCEDURE 系统权限。
- 函数必须包含
RETURN return_type子句,用于声明返回值类型。 - 参数语法与存储过程一致,支持
IN、OUT、IN OUT三种模式,支持DEFAULT与:=两种默认值写法。 OR REPLACE与IF NOT EXISTS均用于处理同名对象已存在的情况:前者覆盖已有函数,后者在对象已存在时不报错、不创建。- 对象名支持
schema_name.function_name形式,也支持使用双引号包裹的引号名。 AS与IS两种写法等价,可任选其一。- 函数体支持
LANGUAGE C形式,用于绑定共享库中的外部函数;使用前需先通过CREATE LIBRARY注册共享库。 - 函数体必须以单独一行的
/结束,否则语句无法正常执行。 - oGRAC 不支持 ALTER FUNCTION 语句。
语法格式
sql
CREATE [OR REPLACE] FUNCTION [IF NOT EXISTS] [schema_name.]function_name
[ ( { [argname] [argmode] argtype [ { DEFAULT | := } default_expr ] } [, ...] ) ]
RETURN return_type
{ AS | IS }
plsql_body
/参数说明
- CREATE [OR REPLACE] FUNCTION:创建函数。
OR REPLACE可选,指定后若同名函数已存在则覆盖重建。 - IF NOT EXISTS:可选。指定后若同名函数已存在,语句不报错,也不执行创建。
- [schema_name.]function_name:函数名称。
schema_name可选,省略时使用当前会话 schema;名称须符合对象命名规则,可使用双引号包裹以保留大小写或使用特殊字符。 - [ ( { [argname] [argmode] argtype [ { DEFAULT | := } default_expr ] } [, ...] ) ]:参数列表,整体可选。
- argname:参数名,可选。省略时只声明参数类型。
- argmode:参数模式,可选,取值为
IN、OUT、IN OUT,默认IN。IN:输入参数,调用时传入值,函数体内只读。OUT:输出参数,调用结束时向调用方返回该参数的值。IN OUT:输入输出参数,调用时传入初值,函数体内可读写,并返回最终结果。
- argtype:参数数据类型。
- { DEFAULT | := } default_expr:参数默认值,可选。
DEFAULT与:=等价,调用时未传入该参数则取默认值。
- RETURN return_type:必选。声明函数的返回值类型。
- { AS | IS }:两种写法等价,用于引出函数体。
- plsql_body:PL/SQL 函数体,通常由可选的
DECLARE声明区和BEGIN ... END;执行区组成,执行区中须包含RETURN语句。 - LANGUAGE C:函数体的外部实现形式,写法为
AS LANGUAGE C NAME c_function_name LIBRARY library_name,其中library_name为已通过CREATE LIBRARY注册的共享库。 - /:语句结束符,必须单独占一行。
示例
创建无参数的函数:
sql
create function bison_ddl_func return int as
begin
return 1;
end;
/使用空参数括号创建函数:
sql
create function bison_ddl_func_empty_args() return int is
begin
return 1;
end;
/创建带参数、带默认值的函数:
sql
create or replace function bison_ddl_func_args(
p_plain int,
p_default int default 1,
p_assign int := 2
) return int is
begin
return p_plain;
end;
/使用 IF NOT EXISTS 创建函数:
sql
create function if not exists bison_ddl_func_if return int as
begin
return 1;
end;
/通过 CREATE LIBRARY 注册共享库后,创建 LANGUAGE C 形式的外部函数:
sql
create or replace library bison_pl_c_noexists as '/tmp/bison_pl_noexists.so';
create or replace function bison_pl_c_semicolon(p varchar2)
return int
as language c name og_ext_len library bison_pl_c_noexists;
/
drop library if exists bison_pl_c_noexists;