Snowflake SQL UDF是否仅支持SQL表达式,不支持Snowflake Scripting?
问题描述
尝试创建一个包含while循环的SQL UDF,初始化计数器变量并返回其值,代码如下:
CREATE OR REPLACE FUNCTION test_func() RETURNS NUMBER AS $$ begin let counter := 0; while (counter < 5) do counter := counter + 1; end while; return counter; end; $$;
参考官方文档的while循环示例编写,但始终编译失败,尝试在declare块中定义变量也无法解决:
declare counter NUMBER;
功能相同的JavaScript版本UDF可正常编译运行:
CREATE OR REPLACE FUNCTION test_func_js() RETURNS VARCHAR LANGUAGE JAVASCRIPT AS $$ let counter = 0; while (counter < 5) { counter += 1; } return counter; $$;
疑问:Snowflake的SQL UDF是否仅支持SQL表达式,不支持Snowflake Scripting?
解答
是的,Snowflake的SQL UDF(默认LANGUAGE SQL)仅支持纯SQL表达式,无法使用Snowflake Scripting的控制流语法(比如while循环、begin/end块、变量声明的let/declare结构等)。
如果需要编写包含控制流逻辑的代码,应该使用Snowflake存储过程(Stored Procedure),而不是SQL UDF。以下是对应逻辑的存储过程示例:
CREATE OR REPLACE PROCEDURE test_proc() RETURNS NUMBER LANGUAGE SQL AS $$ begin let counter := 0; while (counter < 5) do counter := counter + 1; end while; return counter; end; $$;
调用存储过程的方式为:
CALL test_proc();
另外,像你使用的JavaScript UDF这类非SQL语言的UDF,本身支持对应语言的控制流语法,因此可以正常运行。
内容的提问来源于stack exchange,提问作者deepvalue
相关产品推荐
相关产品推荐

