1. 程式人生 > 其它 >[Hana學習筆記]Hana自定義函式

[Hana學習筆記]Hana自定義函式

技術標籤:SAPHANA資料庫sql

提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文件

[Hana學習筆記]Hana自定義函式


Hana自定義函式

Hana和其他資料庫一樣,不但可以定義儲存過程,也可以自定義函式。
自定義函式又分為:標量值函式和表值函式兩種。


一、標量值函式

Returns子句指定一個標量資料型別,可以充當一個欄位使用。

1、建立語法

create function 函式名
(	
	in 引數 引數型別
)
returns 返回值 返回值型別
language
sqlscript as begin SQL語句 end;

2、實際案例

編寫一個SAP物料程式碼轉換函式,程式碼是純數字的則前置補0到18位,否則保持。

create function 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;

函式測試:

select FV_MARA_MATNR('abc'), FV_MARA_MATNR('123'), FV_MARA_MATNR('00123'), FV_MARA_MATNR('abc999') from dummy
;

測試結果:

abc		000000000000000123		000000000000000123		abc999

實際應用:查詢mara中物料程式碼為3504的記錄

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'

二、表值函式

1、建立語法

程式碼如下(示例):

create function 函式名
(
	in 引數 引數型別
)
returns table
(
	欄位 	欄位型別
)
Language SQLScript as
Begin
  return
	SELECT 語句;
end;

2、實際案例

編寫一個字串拆分函式,根據指定的分隔符,將字串拆分為行表。
程式碼如下(示例):

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;

函式測試:

select * from FT_UTIL_SPLIT('A/B/C/E/F','/');

輸出結果:
在這裡插入圖片描述