#自定义函数
自定义函数是数据库里的一种PL对象,简称UDF。
分布式部署中不能创建和使用UDF。
# 创建自定义函数
使用CREATE FUNCTION语句创建自定义函数,其语法定义为:
create function::=
function_head_clause::=
invoker_rights_clause::=
function_body_clause::=
# or replace
当要创建的自定义函数已经存在时,将其进行重建。
# editionable | noneditionable
用于语法兼容,无实际含义。
# function_name
自定义函数的名称,不可省略,且需符合YashanDB的对象命名规范。
# argument_define
自定义函数的参数(形参),可省略,此时function_name()=function_name。最多可以指定4095个参数。
# return_datatype
自定义函数的返回值类型,此处为隐式形参,因此不可以为其指定长度、精度等属性。
# invoker_rights_clause
见首页invoker_rights_clause部分描述。
# variable_declare
声明PL过程体的全局变量,可省略。
# plsql_statements
定义过程体中的执行语句,为PL语句中的一项或多项。
过程体中的每个执行路径(流程控制语句的分支,异常处理单元的分支)里都必须包含至少一个RETURN Statement。
示例(单机、共享集群部署)
CREATE OR REPLACE FUNCTION ya_func(i INT) RETURN VARCHAR
IS
BEGIN
CASE i
WHEN 1 THEN
RETURN 'hello';
WHEN 2 THEN
RETURN 'world';
END CASE;
END ya_func;
/
# 运行自定义函数
# sql语句中调用
与内置函数的调用方法相同,作为SQL表达式使用,例如:
SELECT function_name(arguments) FROM dual;
arguments为与argument_define一一对应的实参,且argument_define不能为IN OUT或OUT形参。
示例(单机、共享集群部署)
SELECT ya_func(1)||' '||ya_func(2) res FROM dual;
RES
----------------------------------------------------------------
hello world
# 过程体中调用
与内置函数的调用方法相同,作为表达式在PL语句中使用,或者用于给变量赋值,例如:
variable_name := procedure_name(arguments);
arguments为与argument_define一一对应的实参。
示例(单机、共享集群部署)
DECLARE
a VARCHAR(10);
b VARCHAR(10);
BEGIN
a := ya_func(1);
b := ya_func(2);
DBMS_OUTPUT.PUT_LINE(a||' '||b);
END;
/
--result
hello world
# 删除自定义函数
使用DROP FUNCTION语句删除自定义函数。
# 修改自定义函数
使用ALTER FUNCTION语句修改自定义函数。