[Hana學習筆記]Hana自定義函式
阿新 • • 發佈:2020-12-27
提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文件
[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','/');
輸出結果: