CREATE FUNCTION (SQL)
創建一個SQL標量或表函數,該函數接受一組參數並返回一個標量值或一組行。
請注意
中創建的函數隻支持此語句hive_metastore
目錄。
語法
創建[或取代][臨時]函數[如果不存在]function_name([function_parameter[,...]])返回{data_type|表格(column_spec[,...])[特征[...]]返回{表達式|查詢}function_parameterparameter_namedata_type[默認的default_expression][評論parameter_comment]column_speccolumn_namedata_type[評論column_comment]特征{語言SQL|[不]確定的|評論function_comment|[包含SQL|讀取SQL數據]|SQL安全定義者}
參數
或替換
如果指定,則替換具有相同名稱和簽名(參數數量和參數類型)的函數。不能用不同的簽名替換現有函數。這主要用於更新函數體和函數的返回類型。無法指定此參數
如果不存在
.臨時
正在創建的函數的範圍。當你指定
臨時
,創建的函數在當前會話中是有效和可見的。在目錄中沒有創建持久條目。如果不存在
如果指定,則僅在函數不存在時創建該函數。如果指定的函數已經存在於係統中,則該函數的創建成功(不會拋出錯誤)。無法指定此參數
或取代
.函數的名稱。對於永久函數,可以選擇用模式名限定函數名。如果名稱沒有限定,則在當前模式中創建永久函數。
function_parameter
指定函數的參數。
參數名在函數中必須是唯一的。
任何支持的數據類型。
在函數調用未將實參分配給形參時使用的可選默認值。
default_expression
必須可塑的來data_type
.表達式不能引用其他參數或包含子查詢。當為一個參數指定默認值時,以下所有參數也必須有默認值。
評論發表評論
參數的可選說明。
評論
必須是STRING字麵值。
標量函數的返回數據類型。
返回表(column_spec[,…])
表函數結果的簽名。
列名在簽名中必須是唯一的。
任何支持的數據類型。
評論column_comment
列的可選描述。
評論
必須是STRING字麵值。
函數的主體。對於標量函數,它可以是查詢或表達式。對於表函數,它隻能是一個查詢。表達式不能包含:
在函數體中,可以通過形參的非限定名或通過函數名限定形參來引用形參。
特征
所有特征子句都是可選的。可以以任何順序指定任意數量的子句,但每個子句隻能指定一次。
語言SQL
函數的語言。SQL是唯一支持的語言。
(不)確定的
函數是否確定。當一個函數對一組給定的參數隻返回一個結果時,它就是確定的。
評論function_comment
函數的注釋。
function_comment
必須是字符串字麵量。包含SQL或讀取SQL數據
函數是否直接或間接從表或視圖讀取數據。當函數讀取SQL數據時,不能指定
包含SQL
.如果不指定這兩個子句,則從函數體派生屬性。SQL安全定義者
函數體和任何默認表達式都是使用函數所有者的授權執行的。這是唯一受支持的行為。
例子
創建和使用SQL標量函數
>創建視圖t(c1,c2)作為值(0,1),(1,2);
——創建一個不帶參數的臨時函數。>創建臨時函數你好()返回字符串返回“Hello World !”;>選擇你好();你好世界!—創建一個帶參數的永久函數。>創建函數區域(x雙,y雙)返回雙返回x*y;在查詢的SELECT子句中使用SQL函數。>選擇區域(c1,c2)作為區域從t;0.02.0——在查詢的WHERE子句中使用SQL函數。>選擇*從t在哪裏區域(c1,c2)>0;12——編寫SQL函數。>創建函數廣場(x雙)返回雙返回區域(x,x);>選擇c1,廣場(c1)作為廣場從t;00.011.0—創建一個非確定性函數>創建函數roll_dice()返回INT不確定的包含SQL評論“擲一個6麵骰子”返回(蘭德()*6)::INT+1;——擲一個6麵骰子>選擇roll_dice();3.
創建並使用一個使用默認值的函數
—擴展功能,支持可變數量的邊和骰子。——使用默認值來支持可變數量的參數>下降函數roll_dice;>創建函數roll_dice(num_diceINT默認的1評論'擲骰子的數量(默認:1)',num_sidesINT默認的6評論每個骰子的邊數(默認值:6))返回INT不確定的包含SQL評論“擲一些n麵骰子”返回總(序列(1,roll_dice.num_dice,1),0,(acc,x)->(蘭德()*roll_dice.num_sides)::int,acc->acc+roll_dice.num_dice);—滾動單個6麵骰子仍然有效>選擇roll_dice();3.擲3個6麵骰子>選擇roll_dice(3.);15擲3個10麵骰子>選擇roll_dice(3.,10)21創建一個帶有標量子查詢的SQL函數。>創建視圖分數(球員,分數)作為值(0,1),(0,2),(1,2),(1,5);>創建函數avg_score(pINT)返回浮動評論“得到玩家的平均分數”返回選擇AVG(分數)從分數在哪裏球員=p;>選擇c1,avg_score(c1)從t;01.513..5
創建一個SQL表函數
——在兩個日期之間的所有工作日>創建函數工作日(開始日期,結束日期)返回表格(day_of_week字符串,一天日期)返回選擇提取(DAYOFWEEK_ISO從一天),一天從(選擇序列(工作日.開始,工作日.結束))作為T(天)橫向視圖爆炸(天)作為一天在哪裏提取(DAYOFWEEK_ISO從一天)之間的1和5;——所有工作日返回>選擇工作日.day_of_week,一天從工作日(日期“2022-01-01”,日期“2022-01-14”);12022-01-0322022-01-043.2022-01-0542022-01-0652022-01-0712022-01-1022022-01-113.2022-01-1242022-01-1352022-01-14—返回來自LATERAL相關性的日期範圍的工作日>選擇工作日.*從值(日期“2020-01-01”),(日期“2021-01-01”),(日期“2022-01-01”)作為開始(開始),橫向工作日(開始,開始+時間間隔“7”天);3.2020-01-0142020-01-0252020-01-0312020-01-0622020-01-073.2020-01-0852021-01-0112021-01-0422021-01-053.2021-01-0642021-01-0752021-01-0812022-01-0322022-01-043.2022-01-0542022-01-0652022-01-07
替換SQL函數
——替換一個SQL標量函數。>創建或取代函數廣場(x雙)返回雙返回x*x;——替換SQL表函數。>創建或取代函數getemps(deptnoINT)返回表格(的名字字符串)返回選擇的名字從員工e在哪裏e.deptno=getemps.deptno;描述一個SQL表函數。>描述函數getemps;函數:默認的.getemps類型:表格輸入:deptnoINT返回:idINT的名字字符串
請注意
不能用不同的簽名替換現有函數。
描述一個SQL函數
>描述函數你好();函數:你好類型:標量輸入:()返回:字符串>描述函數區域;函數:默認的.區域類型:標量輸入:x雙y雙返回:雙>描述函數roll_dice;函數:默認的.roll_dice類型:標量輸入:num_diceINTnum_sidesINT返回:INT>描述函數擴展roll_dice;函數:默認的.roll_dice類型:標量輸入:num_diceINT默認的1'擲骰子的數量(默認:1)'num_sidesINT默認的6每個骰子的麵數(默認值:6)返回:INT評論:卷一個數量的米-站骰子確定的:假數據訪問:包含SQL配置:...老板:的.房子@總是.贏了創建時間:坐2月1209:29:02太平洋標準時間2022身體:總(序列(1,roll_dice.num_dice,1),0,(acc,x)->(蘭德()*roll_dice.num_sides)::int,acc->acc+roll_dice.num_dice)