open cur_view_name_detail; --获得视图列表 loop fetch cur_view_name_detail into lv_table_name; lv_detail_sql:=replace(lv_detail_sql_undo,'VW_OP_MAIL_01_1204',lv_table_name); lv_detail_sql:=replace(lv_detail_sql,'g_run_day_n',to_char(g_run_day_n)); open cur_detail for lv_detail_sql ;--using(g_run_day_n);
。。。。。。
commit; exit when cur_detail%notfound or cur_detail%notfound is null; end loop; close cur_detail; oss_pkg_stat_public.oss_stat_step_log_info(1,g_package_proce_name ,4,'结束--比较省份:'||lv_table_name); exit when cur_view_name_detail%notfound or cur_view_name_detail%notfound is null; end loop; close cur_view_name_detail; oss_pkg_stat_public.oss_stat_step_log_info(1,g_package_proce_name ,5,'结束--比较行为31省份'); commit;
这是个双循环游标提取,而且是动态语句。
外面循环主要是获得物理表名,并且通过替换手法把动态语句的表名和时间参数给替换掉,形成真实的SQL语句。
第二个循环是执行动态语句并提取数据到临时表。
后面代码是退出条件。
发现 如果外循环只有一条记录,则内循环要执行两次。
后来经同事提醒,才感觉 这是个do...while 先执行后判断的循环
For l_Cur_Deal_Table In (Select Table_Type, Rule_No, Sub_Rule_No As Provcodde, Table_Name From Source_Table_Dic_t Where Rule_No = Pi_Rule_No)
Loop
...
end loop;
是先判断后执行 不用人工写判断条件。
为此、执行前追加一条判断语句。
open cur_view_name_detail; --获得视图列表 loop fetch cur_view_name_detail into lv_table_name; lv_detail_sql:=replace(lv_detail_sql_undo,'VW_OP_MAIL_01_1204',lv_table_name); lv_detail_sql:=replace(lv_detail_sql,'g_run_day_n',to_char(g_run_day_n));
exit when cur_view_name_detail%notfound or cur_view_name_detail%notfound is null;