Snowflake SQL存储过程运行报错:无效标识符'C_KEY_REC.KEY_NM'求助
Snowflake SQL存储过程游标遍历错误解决方案
错误根源
你遇到的invalid identifier 'C_KEY_REC.KEY_NM'错误,是因为手动调用OPEN cur_key破坏了Snowflake SQL存储过程的游标自动管理机制。在Snowflake的FOR ... IN <cursor>循环语法中,系统会自动负责游标的打开、逐行遍历和关闭操作,提前打开游标会导致游标状态异常,循环变量c_key_rec无法正确绑定游标返回的字段,从而触发标识符无效的错误。
修正后的完整代码
CREATE OR REPLACE TABLE KEY_TBL ( key_nm VARCHAR ,key_val VARCHAR ,active_yn VARCHAR ); INSERT INTO KEY_TBL(key_nm, key_val, active_yn ) VALUES ('KEY_NAME_1','KEY_VAL_1', 'Y') ,('KEY_NAME_2','KEY_VAL_2', 'Y') ; CREATE OR REPLACE TABLE LOOP_CHK ( key_nm VARCHAR ,key_val VARCHAR ); CREATE OR REPLACE PROCEDURE SP_LOOP_TEST() RETURNS VARCHAR LANGUAGE SQL AS DECLARE cur_key CURSOR FOR SELECT key_nm, key_val FROM KEY_TBL WHERE active_yn = 'Y' ORDER BY key_nm; BEGIN -- 移除多余的OPEN cur_key语句,由FOR循环自动管理游标 FOR c_key_rec IN cur_key DO INSERT INTO LOOP_CHK(key_nm, key_val) VALUES(c_key_rec.key_nm, c_key_rec.key_val); END FOR; RETURN '1'; END; ; CALL SP_LOOP_TEST();
核心注意事项
- 游标自动生命周期管理:Snowflake SQL存储过程的
FOR ... IN <cursor>循环是封装好的游标遍历方式,无需手动执行OPEN/CLOSE操作,手动干预会导致状态冲突。 - 循环变量字段引用:循环变量(如
c_key_rec)直接通过.访问游标查询中的列名即可,确保列名与游标查询中的字段完全匹配(Snowflake默认大小写不敏感,除非列名用双引号定义)。 - 手动游标控制方案(可选):如果需要更精细的游标控制(如中断遍历、部分读取),可以使用
OPEN/FETCH/CLOSE组合,示例代码如下:
CREATE OR REPLACE PROCEDURE SP_LOOP_TEST_MANUAL() RETURNS VARCHAR LANGUAGE SQL AS DECLARE cur_key CURSOR FOR SELECT key_nm, key_val FROM KEY_TBL WHERE active_yn = 'Y' ORDER BY key_nm; v_key_nm VARCHAR; v_key_val VARCHAR; BEGIN OPEN cur_key; FETCH cur_key INTO v_key_nm, v_key_val; WHILE (SQLCODE = 0) DO INSERT INTO LOOP_CHK(key_nm, key_val) VALUES(v_key_nm, v_key_val); FETCH cur_key INTO v_key_nm, v_key_val; END WHILE; CLOSE cur_key; RETURN '1'; END; ;
内容的提问来源于stack exchange,提问作者Jayanta Paul
相关产品推荐
相关产品推荐

