前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SAP HANA中自定义Functions

SAP HANA中自定义Functions

作者头像
Adil_zhang
发布2023-05-02 09:44:51
2860
发布2023-05-02 09:44:51
举报
文章被收录于专栏:Adil_zhangAdil_zhang

前言

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','/');
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 标量值函数
    • 创建语法
      • 实际案例
        • 函数测试
          • 测试结果
            • 实际应用
            • 表值函数
              • 创建语法
                • 实际案例
                  • 函数测试
                  相关产品与服务
                  腾讯云服务器利旧
                  云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档