Snowflake数组输入参数UDF调用报错:参数类型无效
问题分析
你遇到的Invalid argument types for function 'FNTUSERLIST': (ARRAY)错误,核心原因是函数定义了2个必选数组参数,但调用时只传入了1个参数,参数数量不匹配导致编译失败。
解决方案
1. 临时修复调用(适配现有函数)
如果只是想先验证函数可正常调用,暂时不需要第二个参数,调用时传入第二个空数组参数即可:
select * from table(fntuserList(ARRAY_CONSTRUCT('1','2'), ARRAY_CONSTRUCT()));
2. 优化函数定义(推荐,适配后续逻辑)
如果后续I_UserAge参数可能可选,可以将其设为带默认值的可选参数;同时完善函数逻辑,加入数组参数的使用示例(比如根据输入的用户名数组过滤数据):
CREATE OR REPLACE FUNCTION fntuserList (I_UserName array, I_UserAge array DEFAULT ARRAY_CONSTRUCT()) RETURNS TABLE (Id int, UserName varchar(256), UserAge int) AS $$ SELECT Idx as Id, UserName, UserAge FROM UserLoad -- 使用数组参数过滤:匹配用户名在输入数组中,或年龄在输入数组中(可根据需求调整逻辑) WHERE ARRAY_CONTAINS(UserName::VARIANT, I_UserName) OR (ARRAY_SIZE(I_UserAge) > 0 AND ARRAY_CONTAINS(UserAge::VARIANT, I_UserAge)) $$;
此时调用可以只传第一个参数:
select * from table(fntuserList(ARRAY_CONSTRUCT('Rahul', 'Arun')));
也可以同时传两个参数:
select * from table(fntuserList(ARRAY_CONSTRUCT('Rahul'), ARRAY_CONSTRUCT(35,39)));
3. 若仅需单个数组参数
如果实际业务只需要一个数组参数,直接修改函数定义,去掉多余的参数即可:
CREATE OR REPLACE FUNCTION fntuserList (I_UserName array) RETURNS TABLE (Id int, UserName varchar(256), UserAge int) AS $$ SELECT Idx as Id, UserName, UserAge FROM UserLoad WHERE ARRAY_CONTAINS(UserName::VARIANT, I_UserName) $$;
调用方式保持你原来的写法即可正常运行。
内容的提问来源于stack exchange,提问作者Rahul Neekhra
相关产品推荐
相关产品推荐

