CREATE FUNCTION (SQL)

創建一個SQL標量或表函數,該函數接受一組參數並返回一個標量值或一組行。

請注意

中創建的函數隻支持此語句hive_metastore目錄。

語法

創建取代臨時函數如果存在function_namefunction_parameter[,...返回data_type|表格column_spec[,...])特征...返回表達式|查詢function_parameterparameter_namedata_type默認的default_expression評論parameter_commentcolumn_speccolumn_namedata_type評論column_comment特征語言SQL|確定的|評論function_comment|包含SQL|讀取SQL數據|SQL安全定義者

參數

  • 或替換

    如果指定,則替換具有相同名稱和簽名(參數數量和參數類型)的函數。不能用不同的簽名替換現有函數。這主要用於更新函數體和函數的返回類型。無法指定此參數如果存在

  • 臨時

    正在創建的函數的範圍。當你指定臨時,創建的函數在當前會話中是有效和可見的。在目錄中沒有創建持久條目。

  • 如果不存在

    如果指定,則僅在函數不存在時創建該函數。如果指定的函數已經存在於係統中,則該函數的創建成功(不會拋出錯誤)。無法指定此參數取代

  • function_name

    函數的名稱。對於永久函數,可以選擇用模式名限定函數名。如果名稱沒有限定,則在當前模式中創建永久函數。

  • function_parameter

    指定函數的參數。

    • parameter_name

      參數名在函數中必須是唯一的。

    • data_type

      任何支持的數據類型。

    • 默認的default_expression

      在函數調用未將實參分配給形參時使用的可選默認值。default_expression必須可塑的data_type.表達式不能引用其他參數或包含子查詢。

      當為一個參數指定默認值時,以下所有參數也必須有默認值。

    • 評論發表評論

      參數的可選說明。評論必須是STRING字麵值。

  • 返回data_type

    標量函數的返回數據類型。

  • 返回表(column_spec[,…])

    表函數結果的簽名。

    • column_name

      列名在簽名中必須是唯一的。

    • data_type

      任何支持的數據類型。

    • 評論column_comment

      列的可選描述。評論必須是STRING字麵值。

  • 返回{表達式|查詢

    函數的主體。對於標量函數,它可以是查詢或表達式。對於表函數,它隻能是一個查詢。表達式不能包含:

    在函數體中,可以通過形參的非限定名或通過函數名限定形參來引用形參。

  • 特征

    所有特征子句都是可選的。可以以任何順序指定任意數量的子句,但每個子句隻能指定一次。

    • 語言SQL

      函數的語言。SQL是唯一支持的語言。

    • (不)確定的

      函數是否確定。當一個函數對一組給定的參數隻返回一個結果時,它就是確定的。

    • 評論function_comment

      函數的注釋。function_comment必須是字符串字麵量。

    • 包含SQL讀取SQL數據

      函數是否直接或間接從表或視圖讀取數據。當函數讀取SQL數據時,不能指定包含SQL.如果不指定這兩個子句,則從函數體派生屬性。

    • SQL安全定義者

      函數體和任何默認表達式都是使用函數所有者的授權執行的。這是唯一受支持的行為。

例子

創建和使用SQL標量函數

>創建視圖tc1c2作為01),12);
——創建一個不帶參數的臨時函數。>創建臨時函數你好()返回字符串返回“Hello World !”>選擇你好();你好世界—創建一個帶參數的永久函數。>創建函數區域xy返回返回xy在查詢的SELECT子句中使用SQL函數。>選擇區域c1c2作為區域t0020——在查詢的WHERE子句中使用SQL函數。>選擇t在哪裏區域c1c2>012——編寫SQL函數。>創建函數廣場x返回返回區域xx);>選擇c1廣場c1作為廣場t000110—創建一個非確定性函數>創建函數roll_dice()返回INT確定的包含SQL評論“擲一個6麵骰子”返回蘭德()6)::INT+1——擲一個6麵骰子>選擇roll_dice();3.

創建並使用一個使用默認值的函數

—擴展功能,支持可變數量的邊和骰子。——使用默認值來支持可變數量的參數>下降函數roll_dice>創建函數roll_dicenum_diceINT默認的1評論'擲骰子的數量(默認:1)'num_sidesINT默認的6評論每個骰子的邊數(默認值:6)返回INT確定的包含SQL評論“擲一些n麵骰子”返回序列1roll_dicenum_dice1),0accx->蘭德()roll_dicenum_sides)::intacc->acc+roll_dicenum_dice);—滾動單個6麵骰子仍然有效>選擇roll_dice();3.擲3個6麵骰子>選擇roll_dice3.);15擲3個10麵骰子>選擇roll_dice3.1021創建一個帶有標量子查詢的SQL函數。>創建視圖分數球員分數作為01),02),12),15);>創建函數avg_scorepINT返回浮動評論“得到玩家的平均分數”返回選擇AVG分數分數在哪裏球員p>選擇c1avg_scorec1t01513.5

創建一個SQL表函數

——在兩個日期之間的所有工作日>創建函數工作日開始日期結束日期返回表格day_of_week字符串一天日期返回選擇提取DAYOFWEEK_ISO一天),一天選擇序列工作日開始工作日結束))作為T橫向視圖爆炸作為一天在哪裏提取DAYOFWEEK_ISO一天之間的15——所有工作日返回>選擇工作日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返回返回xx——替換SQL表函數。>創建取代函數getempsdeptnoINT返回表格的名字字符串返回選擇的名字員工e在哪裏edeptnogetempsdeptno描述一個SQL表函數。>描述函數getemps函數默認的getemps類型表格輸入deptnoINT返回idINT的名字字符串

請注意

不能用不同的簽名替換現有函數。

描述一個SQL函數

>描述函數你好();函數你好類型標量輸入()返回字符串>描述函數區域函數默認的區域類型標量輸入xy返回>描述函數roll_dice函數默認的roll_dice類型標量輸入num_diceINTnum_sidesINT返回INT>描述函數擴展roll_dice函數默認的roll_dice類型標量輸入num_diceINT默認的1'擲骰子的數量(默認:1)'num_sidesINT默認的6每個骰子的麵數(默認值:6)返回INT評論一個數量-骰子確定的數據訪問包含SQL配置...老板房子@總是贏了創建時間2月12092902太平洋標準時間2022身體序列1roll_dicenum_dice1),0accx->蘭德()roll_dicenum_sides)::intacc->acc+roll_dicenum_dice