procedure中的失足之-----跟变量翻脸

本文介绍了一个关于PLSQL编程中循环变量未正确初始化导致的计算错误案例。通过对比错误与正确代码,强调了每次循环开始前重新初始化变量的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小白工作有点迷糊,居然把1000条数据金额计算算法错了,,摸摸被自己伤到的心脏,吸吸鼻子.....

-----------------------------------------------------------------------------------------------------------
代码功能:对1000条数据进行金额计算,并更新表
错误代码:
   v_current_claim c_current_claim%ROWTYPE;   
   v_claim_ins_amt cfs_plan.insurant_amt%type;
   v_claim_adm_amt cfs_plan.manage_amt%type;
   v_claim_bofo_amt l_subrogation_plan.bofo_amt%type;
   v_overdue_max_date cfs_plan.payment_due_date%TYPE ;
   v_claim_min_date   cfs_plan.payment_due_date%TYPE ;
   v_flag Varchar2(1) := 'N';      begin
    for v_subrogation_plan in c_subrogation_plan loop
        v_claim_ins_amt := 0;
        v_claim_adm_amt := 0;
        v_claim_bofo_amt := 0;        
        
          FOR v_overdue_plan IN c_overdue_plan(v_subrogation_plan.acct_no,v_subrogation_plan.CLAIM_DATE) LOOP
              v_claim_ins_amt := v_claim_ins_amt + v_overdue_plan.INSURANT_AMT;
              v_claim_adm_amt := v_claim_adm_amt + v_overdue_plan.MANAGE_AMT;
              
              IF  v_overdue_plan.PAYMENT_DUE_DATE =  v_subrogation_plan.claim_date THEN 
                  v_flag := 'Y';
              END IF;    
          END LOOP;
end;       

错误分析:
 这个for循环中的变量是每次都需要初始化,还是沿用上一个循环变量的结果,小白曾经犯错过两次!!两次都是以2~3个小时的代价才定位出来,这是多么难的问题吗?!搞不懂啊自己呀,既然记不得,那我从现在起3天每天打卡确保记忆深刻![b][/b]   

正确代码:
   v_current_claim c_current_claim%ROWTYPE;   
   v_claim_ins_amt cfs_plan.insurant_amt%type;
   v_claim_adm_amt cfs_plan.manage_amt%type;
   v_claim_bofo_amt l_subrogation_plan.bofo_amt%type;
   v_overdue_max_date cfs_plan.payment_due_date%TYPE ;
   v_claim_min_date   cfs_plan.payment_due_date%TYPE ;
   v_flag Varchar2(1);              
begin
    for v_subrogation_plan in c_subrogation_plan loop
        v_claim_ins_amt := 0;
        v_claim_adm_amt := 0;
        v_claim_bofo_amt := 0;        
        v_flag := 'N';        
          FOR v_overdue_plan IN c_overdue_plan(v_subrogation_plan.acct_no,v_subrogation_plan.CLAIM_DATE) LOOP
              v_claim_ins_amt := v_claim_ins_amt + v_overdue_plan.INSURANT_AMT;
              v_claim_adm_amt := v_claim_adm_amt + v_overdue_plan.MANAGE_AMT;
              
              IF  v_overdue_plan.PAYMENT_DUE_DATE =  v_subrogation_plan.claim_date THEN 
                  v_flag := 'Y';
              END IF;    
          END LOOP;
end; 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值