#自定义函数

自定义函数是数据库里的一种PL对象,简称UDF。

分布式部署中不能创建和使用UDF。

# 创建自定义函数

使用CREATE FUNCTION语句创建自定义函数,其语法定义为:

create function::=

syntax
CREATE OR REPLACE EDITIONABLE NONEDITIONABLE FUNCTION function_head_clause IS AS function_body_clause ;

function_head_clause::=

syntax
schema . function_name ( argument_define , ) RETURN return_datatype invoker_rights_clause

invoker_rights_clause::=

syntax
AUTHID CURRENT_USER DEFINER

function_body_clause::=

syntax
variable_declare BEGIN plsql_statements END function_name

# or replace

当要创建的自定义函数已经存在时,将其进行重建。

# editionable | noneditionable

用于语法兼容,无实际含义。

# function_name

自定义函数的名称,不可省略,且需符合YashanDB的对象命名规范

# argument_define

自定义函数的参数(形参),可省略,此时function_name()=function_name。最多可以指定4095个参数。

PL参数描述

# return_datatype

自定义函数的返回值类型,此处为隐式形参,因此不可以为其指定长度、精度等属性。

# invoker_rights_clause

首页invoker_rights_clause部分描述。

# variable_declare

声明PL过程体的全局变量,可省略。

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语句修改自定义函数。