Snowflake自定义函数编译报错:parse_json实现IN过滤遇问题
SQL自定义函数编译错误分析与修复
错误原因拆解
异常声明语法不符合规范
Snowflake存储过程/函数中自定义异常的语法并非直接在EXCEPTION后加错误码和描述,原代码里exception1 EXCEPTION (-20001, 'Error');的写法完全错误,这是触发编译报错的核心原因之一。查询语句语法混乱
- 函数内部引用输入参数应直接用参数名
json_name,而非绑定变量格式:json_name; parse_json的调用语法错误,无需as src的冗余写法;lateral flatten的语句结构错误,多了闭合括号,且未正确关联解析后的JSON数据;- 表函数需要用
RETURN QUERY指定返回的结果集,原代码缺少这个关键语句。
修正后的函数代码
CREATE OR REPLACE FUNCTION db.schema.function1(json_name VARCHAR) RETURNS TABLE(json_col VARCHAR) AS $$ BEGIN -- 解析JSON并扁平化非空值,返回结果集 RETURN QUERY SELECT value::VARCHAR AS json_col FROM TABLE(flatten(input => parse_json(json_name))) WHERE value IS NOT NULL; END; $$ LANGUAGE plpgsql;
可选:添加自定义异常处理
如果需要对无效输入做异常抛出,可以按照Snowflake规范补充逻辑:
CREATE OR REPLACE FUNCTION db.schema.function1(json_name VARCHAR) RETURNS TABLE(json_col VARCHAR) AS $$ DECLARE exception1 EXCEPTION; BEGIN IF json_name IS NULL OR json_name = '' THEN RAISE exception1 USING MESSAGE = 'Invalid JSON input', ERRCODE = '-20001'; END IF; RETURN QUERY SELECT value::VARCHAR AS json_col FROM TABLE(flatten(input => parse_json(json_name))) WHERE value IS NOT NULL; EXCEPTION WHEN exception1 THEN RAISE; END; $$ LANGUAGE plpgsql;
内容的提问来源于stack exchange,提问作者Robertino Bonora
相关产品推荐
相关产品推荐

