首页 > 解决方案 > Oracle 中的嵌套循环无法正常工作(超过最大值)

问题描述

我为示例表编写了这两个查询以从“z_exp14_main”插入“z_exp14_resualt”。第一个查询工作正常(空),但第二个查询在主表上有due_date(非空),不能正常工作!. 我认为问题是循环。
它在截止日期之前开始,甚至超过了截止日期。对于 NOT Nulls,插入必须从今天开始(从 sysdate 开始的年份和 monts 以及从 opening_date 开始的日期)并一直持续到 due_date

计算空 DUE_DATES

declare
  i number := 1;
BEGIN
for i in 1..12 loop
  insert into z_exp14_resualt 
  select dep_id,ADD_MONTHS(ADD_MONTHS(opening_date,trunc( months_between (sysdate,opening_date))),i),rate*balance 
  from z_exp14_main
  WHERE due_date IS  null;
end loop;
END;
/

并且对于非空 Due_dates

  DECLARE
    diff number;
    x number :=1;
    BEGIN    
    for i in (select * FROM z_exp14_main WHERE due_date IS NOT null) loop    
        diff :=trunc( months_between (sysdate,i.opening_date));
        
            WHILE (ADD_MONTHS(ADD_MONTHS(i.opening_date,diff),x)<i.due_date) LOOP
                insert into z_exp14_resualt 
                select dep_id,ADD_MONTHS(ADD_MONTHS(i.opening_date,diff),x),rate*balance 
                from z_exp14_main WHERE due_date is not null  ;
                x :=x+1;
            end loop;
      end loop;
    end;
    /

主要日期示例 (z_exp14_main)

-- DEP_ID 截止日期 平衡 速度 OPENING_DATE
-- 20056634 无效的 283428 10 16 年 9 月 15 日
-- 20056637 无效的 180222 10 14 年 11 月 7 日
-- 20056639 无效的 58741 10 14 年 8 月 28 日
-- 40000020 21 年 11 月 27 日 500万 22 14 年 3 月 31 日
-- 40000023 21 年 4 月 23 日 63000000 22 18 年 8 月 25 日

标签: sqldatabaseoraclestored-proceduresplsql

解决方案


问题在于“虽然”条件。我纠正它,这是最终答案:

DECLARE
    diff number;
    x number ;
    BEGIN    
    for i in (select * FROM z_exp14_main WHERE due_date IS NOT null) loop    
        diff :=trunc( months_between (sysdate,i.opening_date));
        x:=0;
            WHILE (add_months(sysdate,x)<i.due_date) LOOP
                insert into z_exp14_resualt values (i.dep_id,ADD_MONTHS(ADD_MONTHS(i.opening_date,diff),x),(i.rate*i.balance) );
                x :=x+1;
            end loop;
      end loop;
    end;
    /

推荐阅读