CREATE SQL FUNCTION

概述

CREATE FUNCTION
CREATE FUNCTION
语句用于在 Lakehouse 中创建 SQL 标量函数或表函数。这些函数可以接受一组参数,并返回标量值或一组行。本文将详细介绍其语法、参数、使用示例。

语法

CREATE [OR REPLACE] FUNCTION [IF NOT EXISTS] function_name ( [ function_parameter [, ...] ] ) [ RETURNS data_type | RETURNS TABLE(column_spec)] AS|RETURN { expression | query }; function_parameter parameter_name data_type [ DEFAULT default_expr | = default_expr ] ; column_spec column_name data_type ;

参数说明

  • OR REPLACE
    OR REPLACE
    • 如果指定此参数,将替换具有相同名称和签名(参数数量和类型)的现有函数。
    • 不能与
      IF NOT EXISTS
      IF NOT EXISTS
      同时使用。
  • IF NOT EXISTS
    IF NOT EXISTS
    :如果指定,仅在函数不存在时才会创建。
  • function_name
    function_name
    :函数的名称,可以使用schema名称限定。
  • function_parameter
    function_parameter
    • parameter_name
      parameter_name
      :参数名称必须在函数中唯一。
    • DEFAULT default_expr
      DEFAULT default_expr
      = default_expr
      = default_expr
      (可选):为参数指定默认值。调用函数时可以省略有默认值的尾部参数。带默认值的参数必须排在无默认值的参数之后。默认值可以是字面量、NULL 或 CAST 表达式等。
    • data_type
      data_type
      :支持的任何数据类型。
  • RETURNS data_type
    RETURNS data_type
    • 标量函数的返回数据类型。如果未提供数据类型,将从函数体派生。
  • RETURNS TABLE
    RETURNS TABLE
    :定义返回表结构,需指定列名和数据类型
  • AS|RETURN {expression | query}
    AS|RETURN {expression | query}
    • 函数的主体。对于标量函数,可以是表达式或查询;对于表函数,只能是查询。

示例

  • 创建和使用 SQL 标量函数

-- 创建一个函数,指定返回值 CREATE FUNCTION public.area(x DOUBLE, y DOUBLE) RETURNS DOUBLE RETURN x * y; -- 在查询中使用函数 SELECT public.area(3, 4); -- 输出:12.0 -- 创建一个函数,使用AS指定处理逻辑 CREATE FUNCTION public.area2(x DOUBLE, y DOUBLE) RETURNS double AS x * y; SELECT public.area2(3, 4);

  • 指定返回类型

CREATE FUNCTION public.hello() RETURNS STRING AS 'Hello World!'; SELECT public.hello();

  • 在expression使用内置函数

CREATE FUNCTION public.roll_dice(num_dice INT , num_sides INT ) RETURNS INT COMMENT 'Roll a number of n-sided dice' RETURN (rand() * num_sides)::INT + 1; SELECT public.roll_dice(3, 10);

  • 返回一个返回表类型

CREATE TABLE employee ( id INT, name STRING, deptno INT ); INSERT INTO employee (id, name, deptno) VALUES (1, 'Alice', 10), (2, 'Bob', 10), (3, 'Charlie', 20), (4, 'David', 10), (5, 'Eve', 20); CREATE OR REPLACE FUNCTION ga1_1.getemps(deptno INT) RETURNS TABLE (name STRING) RETURN SELECT name FROM employee e WHERE e.deptno = deptno; SELECT * FROM ga1_1.getemps(10);

注意事项

  • 使用函数时必须指定创建时函数所在的Schema否则会错函数找不到。 您可以通过设置参数来cz.sql.remote.udf.lookup.policy避免报错。该参数是。动态切换 UDF 与内置函数的解析优先级。默认行为,使用UDF时必须带SCHEMA前缀,如下案例

    --创建函数 CREATE FUNCTION public.lower() RETURNS STRING AS 'Hello World!'; --使用函数,必须写SCHMA否则会报错函数找不到 SELECT public.lower(); -- 策略1:优先调用内置函数,可以不用写SCHMA。如果和内置函数同名优先使用内置函数 SET cz.sql.remote.udf.lookup.policy = builtin_first; SELECT lower(); -- 策略2:优先调用UDF(适配MC/Spark作业场景)。如果和内置函数同名优先使用udf SET cz.sql.remote.udf.lookup.policy = udf_first; SELECT lower();

联系我们
预约咨询
微信咨询
电话咨询