首批通过分布式安全可靠测评,为关键业务系统打造
CREATE FUNCTION
更新时间:2026-03-29 18:26:15
描述
CREATE FUNCTION 语句用于创建或替换独立函数或调用规范。独立函数是指存储在数据库中的函数(返回单个值的子程序)。
功能适用性
该内容仅适用于 OceanBase 数据库企业版。OceanBase 数据库社区版仅提供 MySQL 模式。
注意
使用 CREATE FUNCTION 语句创建的独立函数不同于在 PL 块或包中声明和定义的函数。
前提条件
要在 Schema 中创建或替换独立函数,必须具有 CREATE FUNCTION 的系统权限。要在另一个用户的 Schema 中创建或替换独立函数,则必须具有 CREATE ANY FUNCTION 的系统权限。
语法
create_function 的语法如下:
CREATE [ OR REPLACE ]
FUNCTION plsql_function_source
其中,plsql_function_source 的语法如下:
[ schema. ] function_name
[ ( parameter_declaration [, parameter_declaration]... ) ]
RETURN datatype [ sharing_clause ]
[ invoker_rights_clause
| accessible_by_clause
| DETERMINISTIC
| parallel_enable_clause
| result_cache_clause
| default_collation_clause
| pipelined_clause
]...
{ { AGGREGATE | PIPELINED } USING [ schema. ] implementation_type
| [ PIPELINED ] { IS | AS } { [ declare_section ] body
| call_spec
}
} ;
语义
| 语法 | 关键字或语法节点 | 说明 |
|---|---|---|
| create_function | OR REPLACE | 重新创建该函数(如果存在),然后重新编译。在重新定义函数之前被授予该函数权限的用户仍然可以访问该函数而无需重新获得权限。如果有任何基于函数的索引依赖于该函数,则数据库会将索引标记为 DISABLED。 |
| plsql_function_source | schema | 该函数所在的 Schema 名称。默认值为当前用户的 Schema。 |
| plsql_function_source | function_name | 要创建的函数名称。 |
| plsql_function_source | RETURN datatype | 对于数据类型,请指定函数返回值的数据类型。返回值可以为 PL 所支持的任何数据类型。 |
| plsql_function_source | body | 函数所必需的可执行部分,以及函数的异常处理部分(可选)。 |
| plsql_function_source | declare_section | 函数的可选声明部分。声明对于函数来说是局部的,可以在 body 中引用,在函数完成执行后不再存在。 |
| plsql_function_source | DETERMINISTIC | 表示该函数是确定性的,即对于相同的输入参数总是返回相同的结果。这对于优化查询性能很重要。 |
| plsql_function_source | parallel_enable_clause | 表示该函数可以在并行查询中安全执行。当指定此特性时,函数必须满足确定性、不修改数据库状态、不依赖会话状态等条件。 |
示例
创建函数 get_salary_by_dept。
CREATE OR REPLACE FUNCTION get_salary_by_dept(
v_in_dept_id NUMBER,
v_out_emp_count OUT NUMBER)
RETURN NUMBER
IS
v_sum NUMBER;
BEGIN
SELECT SUM(salary), count(*) INTO v_sum, v_out_emp_count
FROM employees WHERE deptno=v_in_dept_id;
RETURN v_sum;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Dept id '||v_in_dept_id||' not found');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERR: '||SQLCODE||': '||SQLERRM);
END get_salary_by_dept;
/
创建可以在并行查询中安全执行的函数。
CREATE OR REPLACE FUNCTION sub_query_result(input VARCHAR)
DETERMINISTIC
PARALLEL_ENABLE
RETURN VARCHAR
IS
result tp_sys_para.para_value%type;
BEGIN
SELECT tp.para_value INTO result
FROM tp_sys_para tp
WHERE tp.para_name_e = input;
RETURN result;
END;
/