使用Snowflake Scripting SQL更新表列时遇'PRICE_NEW'无效标识符错误求助
问题解决:Snowflake存储过程更新报错"invalid identifier 'PRICE_NEW'"
错误原因
你写的存储过程里,UPDATE语句中的price_new被Snowflake当成了sweatsuits表的列名,但你的表并没有这个字段,因此报错。这是因为Snowflake解析UPDATE语句时,会优先查找目标表的字段,而非存储过程中声明的局部变量。
而且你的写法完全没必要用游标循环逐行更新,这种方式性能极低,一条UPDATE语句就能完成需求。
最佳解决方案:用单条UPDATE语句替代存储过程
如果只是要给color_or_style为'Pink'或'Red'的行的price加100,直接执行下面的SQL即可:
UPDATE sweatsuits SET price = price + 100 WHERE color_or_style IN ('Pink', 'Red');
如果一定要用存储过程封装,把这条语句放进存储过程里就行:
CREATE OR REPLACE PROCEDURE sp_up_base_table() RETURNS TEXT LANGUAGE SQL AS $$ BEGIN UPDATE sweatsuits SET price = price + 100 WHERE color_or_style IN ('Pink', 'Red'); RETURN 'update success'; END; $$;
若要保留原游标写法(不推荐)
要让Snowflake识别到price_new是局部变量,需要给变量加上:前缀标记:
CREATE OR REPLACE PROCEDURE sp_up_base_table() RETURNS TEXT LANGUAGE SQL AS $$ DECLARE price_new number(5,2); color_or_style_text text; c1 CURSOR FOR SELECT * FROM sweatsuits WHERE color_or_style IN ('Pink', 'Red'); BEGIN FOR rec IN c1 DO color_or_style_text := rec.color_or_style; price_new := rec.price + 100; -- 给变量加:前缀,明确这是存储过程的局部变量 UPDATE sweatsuits SET price = :price_new where color_or_style = :color_or_style_text; END FOR; RETURN 'update success'; END; $$;
但还是强烈建议用单条UPDATE的写法,游标循环逐行更新在数据量大时性能会非常差。
内容的提问来源于stack exchange,提问作者user8545255
相关产品推荐
相关产品推荐

