sql - 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 日 |
解决方案
问题在于“虽然”条件。我纠正它,这是最终答案:
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;
/
推荐阅读
- php - 电子邮件管道有效,但退回电子邮件已发送
- sql-server - 如何在带有 CONCAT 的 SELECT 语句中使用 CASE
- python - 将 pandas 数据帧导出为 JSON 时如何解决 OverflowError
- angular - Angular 2+ 中属性的规范化规则是什么?
- javascript - 如何用 yazl 压缩缓冲区?
- azure - Azure 扩展事件目标文件
- flutter - 如何在文本字段中添加图标
- c# - 如何使用 for 循环将编号对象属性设置为数组中的值?
- azure - 当我们使用 Azure 数据湖存储作为 Azure 分析服务的数据源时,是否支持 Parquet 文件格式?
- cross-origin-read-blocking - 修复跨域读取阻塞 (CORB) 阻止的跨域响应警告