Snowflake存储过程中如何嵌套遍历内外游标的记录?
问题原因及解决办法
问题出在内层游标cur1的生命周期上:Snowflake的游标在首次遍历完成后,会处于耗尽状态(游标指针停在结果集末尾),后续外层循环再进入内层时,cur1没有新的数据可以遍历,因此只有第一次外层循环对应的2条记录被插入,剩下9次外层循环的内层逻辑都不会执行。
修正方案
方案1:每次外层循环重新声明内层游标
将内层游标的定义放到外层循环内部,确保每次外层循环都重新获取完整的内层结果集:
FOR rec2 IN cur2 DO acct_num := rec2.ACCT_NUM; post_item_num := rec2.POST_ITEM_NUM; acc := rec2.ACCTG_DOC_ID; -- 每次外层循环都重新初始化内层游标,替换成你的实际查询语句 LET cur1 CURSOR FOR SELECT FIS_YR FROM [内层数据源表/查询]; FOR rec1 IN cur1 DO fis_yr := rec1.FIS_YR; QUERY := 'INSERT INTO INT_P(ACCTG_DOC_ID,ACCT_NUM,POST_ITEM_NUM,FIS_YR) VALUES (?,?,?,?)'; execute immediate :QUERY using (acc, acct_num,post_item_num,fis_yr); END FOR; END FOR;
方案2:每次外层循环重置已声明的内层游标
如果cur1是在外层循环外提前声明的,可通过每次外层循环前重新打开游标来重置:
-- 提前声明内层游标 LET cur1 CURSOR FOR SELECT FIS_YR FROM [内层数据源表/查询]; FOR rec2 IN cur2 DO acct_num := rec2.ACCT_NUM; post_item_num := rec2.POST_ITEM_NUM; acc := rec2.ACCTG_DOC_ID; -- 重新打开游标,重置结果集指针 OPEN cur1; FOR rec1 IN cur1 DO fis_yr := rec1.FIS_YR; QUERY := 'INSERT INTO INT_P(ACCTG_DOC_ID,ACCT_NUM,POST_ITEM_NUM,FIS_YR) VALUES (?,?,?,?)'; execute immediate :QUERY using (acc, acct_num,post_item_num,fis_yr); END FOR; -- 遍历完成后关闭游标(可选,Snowflake会自动管理,但显式关闭更规范) CLOSE cur1; END FOR;
补充说明
两种方案都能确保每次外层循环时,内层游标都能获取完整的2条数据,最终实现10*2=20条记录的插入。
内容的提问来源于stack exchange,提问作者trainingaz
相关产品推荐
相关产品推荐

