Snowflake存储过程调用UDTF传入绑定参数时提示无效标识符求助
解决Snowflake存储过程传递参数到UDTF时的"invalid identifier"错误
问题原因
你遇到的invalid identifier 'LANGUAGE_KEY'错误,根源是Snowflake的标识符大小写规则:
- 用双引号包裹的标识符(比如你定义的
"Language_key")是大小写敏感的,会保留原有的大小写格式。 - 未加双引号的标识符会被Snowflake自动转换为大写。
你在存储过程内部引用参数时用了:language_key,Snowflake会将其自动转为LANGUAGE_KEY,但你定义的参数是Language_key(带双引号的大小写混合名),两者不匹配,因此触发了标识符不存在的错误。
解决方案
有两种可行的修改方式:
方式一:保持参数的大小写敏感定义,引用时匹配大小写
在引用参数时,用括号加双引号包裹参数名,确保Snowflake识别到正确的大小写参数:
CREATE OR REPLACE PROCEDURE MEDICATION_MODEL_NLS_Test("Language_key" VARCHAR DEFAULT 'en') RETURNS TABLE () LANGUAGE SQL EXECUTE AS CALLER AS $$ DECLARE res RESULTSET; BEGIN res := (SELECT * FROM TABLE(GET_MEDICATION(:("Language_key")))); RETURN TABLE(res); END $$;
方式二:取消参数的大小写敏感定义
定义参数时去掉双引号,让Snowflake自动将参数名转为大写,此时内部引用时无论大小写都会被识别为大写参数:
CREATE OR REPLACE PROCEDURE MEDICATION_MODEL_NLS_Test(Language_key VARCHAR DEFAULT 'en') RETURNS TABLE () LANGUAGE SQL EXECUTE AS CALLER AS $$ DECLARE res RESULTSET; BEGIN res := (SELECT * FROM TABLE(GET_MEDICATION(:language_key))); RETURN TABLE(res); END $$;
两种方式都能解决参数传递的问题,你可以根据自己的标识符命名习惯选择其中一种。
内容的提问来源于stack exchange,提问作者Rahul Bhosale
相关产品推荐
相关产品推荐

