You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 01:05:19