#自定义函数

自定义函数是数据库里的一种PL/SQL对象,简称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/SQL参数描述

# return_datatype

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

# invoker_rights_clause

首页invoker_rights_clause部分描述。

# variable_declare

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

PL/SQL变量描述

# plsql_statements

定义过程体中的执行语句,为PL/SQL语句中的一项或多项。

过程体中的每个执行路径(流程控制语句的分支,异常处理单元的分支)里都必须包含至少一个RETURN Statement

示例

CREATE OR REPLACE FUNCTION ya_proc(i INT) RETURN VARCHAR
IS
BEGIN
CASE i
WHEN 1 THEN
RETURN 'hello';
WHEN 2 THEN
RETURN 'world';
END CASE;
END ya_proc;
/

# 运行自定义函数

# sql语句中调用

内置函数的调用方法相同,作为SQL表达式使用,例如:

SELECT function_name(arguments) FROM dual;

arguments为与argument_define一一对应的实参。

值得注意的是,对于一个定义了IN OUT或OUT形参的自定义函数,并不支持通过此种方式调用。

示例

SELECT ya_proc(1)||' '||ya_proc(2) FROM dual;
YA_PROC(1)||''||YA_P                                             
---------------------------------------------------------------- 
hello world 

# 过程体中调用

内置函数的调用方法相同,作为表达式在PLSQL语句中使用,或者用于给变量赋值,例如:

variable_name := procedure_name(arguments);

arguments为与argument_define一一对应的实参。

示例

DECLARE
  a VARCHAR(10);
  b VARCHAR(10);
BEGIN
  a := ya_proc(1);
  b := ya_proc(2);
  DBMS_OUTPUT.PUT_LINE(a||' '||b);
END;
/

--result
hello world

# 删除自定义函数

使用DROP FUNCTION语句删除自定义函数。