創建函數
適用於:磚的SQL磚運行時9.1及以上
創建一個SQL標量或表函數,它接受一組參數,並返回一個標量值或一組行。
語法
創建(或取代](臨時]函數(如果不存在]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
指定一個參數的函數。
函數中的參數名稱必須是惟一的。
任何受支持的數據類型。
適用於:磚的SQL磚運行時10.4及以上
使用一個可選的默認函數調用時不分配一個參數參數。
default_expression
必須可塑的來data_type
。表達式不能引用另一個參數或包含子查詢。當你為一個參數,指定一個默認的所有參數後也必須有一個默認。
評論發表評論
一個可選參數的描述。
評論
必須是一個字符串。
標量函數的返回數據類型。
收益表(column_spec […])
的簽名表函數的結果。
簽名中列名必須是唯一的。
任何受支持的數據類型。
評論column_comment
一個可選的列的描述。
評論
必須是一個字符串。
的主體功能。對於一個標量函數,它可以是一個查詢或一個表達式。對於一個表函數,它隻能查詢。不能包含的表達式:
身體內的函數可以參考參數的不合格由有資格的函數的參數名稱或名字。
特征
所有條款都是可選的特征。您可以指定任何數量的訂單,但您可以指定每個條款隻有一次。
語言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;——使用一個SQL SELECT子句的查詢功能。>選擇區域(c1,c2)作為區域從t;0。02。0——使用一個SQL WHERE子句的查詢功能。>選擇*從t在哪裏區域(c1,c2)>0;12——編寫SQL函數。>創建函數廣場(x雙)返回雙返回區域(x,x);>選擇c1,廣場(c1)作為廣場從t;00。011。0——創建一個非確定函數>創建函數roll_dice()返回INT不確定的包含SQL評論“一個六麵骰子滾”返回(蘭德()*6)::INT+1;——一個六麵骰子滾>選擇roll_dice();3
創建和使用一個函數,使用默認值
——擴展函數支持變量,骰子。——使用默認支持數量可變的參數>下降函數roll_dice;>創建函數roll_dice(num_diceINT默認的1評論骰子滾的數量(默認值:1)”,num_sidesINT默認的6評論“每個死亡的邊數(默認值:6)”)返回INT不確定的包含SQL評論“許多n-sided骰子滾”返回總(序列(1,roll_dice。num_dice,1),0,(acc,x)- >(蘭德()*roll_dice。num_sides)::int,acc- >acc+roll_dice。num_dice);——一個六麵骰子滾仍能工作>選擇roll_dice();3——卷3六麵骰子>選擇roll_dice(3);15——卷3 10-sided骰子>選擇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- - - - - -0432022年- - - - - -01- - - - - -05年42022年- - - - - -01- - - - - -0652022年- - - - - -01- - - - - -07年12022年- - - - - -01- - - - - -1022022年- - - - - -01- - - - - -1132022年- - - - - -01- - - - - -1242022年- - - - - -01- - - - - -1352022年- - - - - -01- - - - - -14——返回工作日日期範圍來自橫向相關性>選擇工作日。*從值(日期“2020-01-01”),(日期“2021-01-01”),(日期“2022-01-01”)作為開始(開始),橫向工作日(開始,開始+時間間隔“7”天);32020年- - - - - -01- - - - - -0142020年- - - - - -01- - - - - -0252020年- - - - - -01- - - - - -0312020年- - - - - -01- - - - - -0622020年- - - - - -01- - - - - -07年32020年- - - - - -01- - - - - -08年52021年- - - - - -01- - - - - -0112021年- - - - - -01- - - - - -0422021年- - - - - -01- - - - - -05年32021年- - - - - -01- - - - - -0642021年- - - - - -01- - - - - -07年52021年- - - - - -01- - - - - -08年12022年- - - - - -01- - - - - -0322022年- - - - - -01- - - - - -0432022年- - - - - -01- - - - - -05年42022年- - - - - -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)