Oracle 中的嵌套循环无法正常工作(超过最大值)
Nested Loops In Oracle Not Work Correctly (Exceeds the maximum)
我为示例 Table 编写了这两个查询以从“z_exp14_main”插入“z_exp14_resualt”。 第一个查询工作正常(空)但第二个查询在主table(非空)上有due_date,工作不正常! .我认为问题在于循环。
它在截止日期之前开始,甚至超过了截止日期。对于 NOT Nulls,插入必须从今天开始(年和月从 sysdate 开始,日期从 opening_date 开始)并继续直到 due_date
计算 Null 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;
/
并且对于 Not Null 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
DUE_DATE
BALANCE
RATE
OPENING_DATE
--
20056634
null
283428
10
15-SEP-16
--
20056637
null
180222
10
07-NOV-14
--
20056639
null
58741
10
28-AUG-14
--
40000020
27-NOV-21
5000000
22
31-MAR-14
--
40000023
23-APR-21
63000000
22
25-AUG-18
问题出在“While”条件下。我更正了,这是最终答案:
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;
/
我为示例 Table 编写了这两个查询以从“z_exp14_main”插入“z_exp14_resualt”。 第一个查询工作正常(空)但第二个查询在主table(非空)上有due_date,工作不正常! .我认为问题在于循环。
它在截止日期之前开始,甚至超过了截止日期。对于 NOT Nulls,插入必须从今天开始(年和月从 sysdate 开始,日期从 opening_date 开始)并继续直到 due_date
计算 Null 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;
/
并且对于 Not Null 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 | DUE_DATE | BALANCE | RATE | OPENING_DATE |
---|---|---|---|---|---|
-- | 20056634 | null | 283428 | 10 | 15-SEP-16 |
-- | 20056637 | null | 180222 | 10 | 07-NOV-14 |
-- | 20056639 | null | 58741 | 10 | 28-AUG-14 |
-- | 40000020 | 27-NOV-21 | 5000000 | 22 | 31-MAR-14 |
-- | 40000023 | 23-APR-21 | 63000000 | 22 | 25-AUG-18 |
问题出在“While”条件下。我更正了,这是最终答案:
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;
/