ETL流程ID校验循环仅执行一次问题求助
问题分析与修复方案
嘿,我一眼就揪出你ETL流程里的问题了——你的循环逻辑写错了,导致它只执行一次就停止!
问题根源
看你这段代码:
BEGIN -- there is only ever 1 row in staging. declare id1 char(12) default (select id from stg.extraction); loop_label: Loop if id1 not in (select id from main.extraction) Then leave loop_label; end if; set id1=id1+1; leave loop_label; -- 这里是罪魁祸首! End Loop; update stg.extraction set id=id1; END
不管id1是否已经在main.extraction里存在,最后一行的leave loop_label;都会执行。也就是说,哪怕当前ID已经被占用,程序给ID加1之后直接就退出循环了,根本没机会去检查新的ID是否可用。
修复后的Loop版本
只需要把那个多余的leave loop_label;删掉就行,这样只有当找到未被使用的ID时才会退出循环:
BEGIN -- there is only ever 1 row in staging. declare id1 char(12) default (select id from stg.extraction); loop_label: Loop if id1 not in (select id from main.extraction) Then leave loop_label; -- 只有找到可用ID才退出 end if; set id1=id1+1; -- ID被占用就加1,继续循环 End Loop; update stg.extraction set id=id1; END
转为While循环的版本
如果你想换成While循环,逻辑会更直观,写法如下:
BEGIN declare id1 char(12) default (select id from stg.extraction); -- 当ID已被使用时,持续循环 while id1 in (select id from main.extraction) do set id1=id1+1; end while; update stg.extraction set id=id1; END
这个版本的逻辑更清晰:只要当前ID在main库中存在,就不断给ID加1,直到找到未被使用的ID为止。
内容的提问来源于stack exchange,提问作者Exostrike
相关产品推荐
相关产品推荐

