前言
Hana和其他数据库一样,不但可以定义存储过程,也可以自定义函数。 自定义函数又分为:标量值函数和表值函数两种。
标量值函数
Returns子句指定一个标量数据类型,可以充当一个字段使用
创建语法
代码语言:javascript复制create function schema名.函数名
(
in 参数 参数类型
)
returns 返回值 返回值类型
language sqlscript as
begin
SQL语句
end;
实际案例
代码语言:javascript复制create function SUSER.FV_MARA_MATNR
(
in i_matnr nvarchar(40) --输入物料代码
)
returns o_matnr nvarchar(40) --输出物料代码
language sqlscript as
begin
if(:i_matnr <> '') then
select case when length(replace_regexpr('[^0-9]' in :i_matnr))=length(:i_matnr) then
left('000000000000000000',18-length(:i_matnr))||(:i_matnr) else :i_matnr end
into o_matnr
from dummy;
else
select :i_matnr into o_matnr from dummy;
end if;
end;
函数测试
代码语言:javascript复制select FV_MARA_MATNR('abc'), FV_MARA_MATNR('123'), FV_MARA_MATNR('00123'), FV_MARA_MATNR('abc999') from dummy;
测试结果
代码语言:javascript复制abc 000000000000000123 000000000000000123 abc999
实际应用
查询mara中物料代码为3504的记录
代码语言:javascript复制select * from mara where mandt=800 and matnr=3504 --attribute value is not a number
select * from mara where mandt=800 and matnr='3504' --no record selected
select * from mara where mandt=800 and matnr=FF_MARA_MATNR('3504') --selected record matnr='000000000000003504'
表值函数
创建语法
代码语言:javascript复制create function 函数名
(
in 参数 参数类型
)
returns table
(
字段 字段类型
)
Language SQLScript as
Begin
return
SELECT 语句;
end;
实际案例
编写一个字符串拆分函数,根据指定的分隔符,将字符串拆分为行表。
代码语言:javascript复制create function FT_UTIL_SPLIT
(
in i_Text nvarchar(4000) DEFAULT '', -- 字符串
in i_splitChar nvarchar(1) DEFAULT ',' -- 分隔符
)
returns table
(
FCODE nvarchar(100)
)
Language SQLScript
as
Begin
declare _items varchar(100) ARRAY;
declare _text varchar(4000);
declare _index integer;
_text := :i_Text;
_index := 1;
WHILE LOCATE(:_text,i_splitChar) > 0 DO
_items[:_index] := SUBSTR_BEFORE(:_text,i_splitChar);
_text := SUBSTR_AFTER(:_text,i_splitChar);
_index := :_index 1;
END WHILE;
_items[:_index] := :_text;
rst = UNNEST(:_items) AS ("FCODE"); -- 存入临时表rst
return
SELECT * FROM :rst;
end;
函数测试
代码语言:javascript复制select * from FT_UTIL_SPLIT('A/B/C/E/F','/');