首页 > 解决方案 > 存储过程中没有为 Cursor 运行循环

问题描述

我写了一个查询,我选择了 2 列,这些是大约 40 条记录。

现在我想通过一一选择对这些记录进行总和计算。

在我的存储过程中,我使用了一个游标来存储这 40 条记录。并使用 for 循环并对这些记录进行总和计算(一一)

但是对于第一条记录, sum 为空,我的循环没有从游标中获取另一条记录。

这就是为什么我无法一一计算每条记录的总和,因为我的 for 循环不再运行。

    cursor details is
        select distinct lpn_id v_olpn_id, lpn_detail_id v_olpn_detail_id
        from   lpn_detail ld
        where  size_value > '0'
        and    lpn_id in
               ( select lpn_id from lpn
                 where  lpn_facility_status > '15'
                 and    lpn_facility_status < '90'
                 and    inbound_outbound_indicator = 'O' ) 
        and    item_id in
               ( select item_id from item_cbo where catch_weight_item = '1' ) 
        and    not exists
               ( select 1 from lpn_catch_weight lwc
                 where  lwc.lpn_detail_id = ld.lpn_detail_id );

begin
    for detail in details 
    loop
        select sum(ld.ref_num4*td.qty_pulld) into v_total_weight 
        from   lpn_detail ld, lpn l, task_dtl td
        where  l.lpn_id = ld.lpn_id
        and    l.tc_lpn_id=td.cntr_nbr
        and    ld.item_id=td.item_id
        and    l.lpn_id in
               ( select lpn_id from lpn where tc_lpn_id in
                        ( select cntr_nbr from task_dtl
                          where  carton_nbr in
                                 ( select tc_lpn_id from lpn
                                   where  lpn_id=detail.v_olpn_id ) ) )
        and    ld.ref_num4 is not null
        and    td.invn_need_type = 60
        group by ld.item_id;
    end loop;

标签: sqloraclefor-loopstored-procedurescursor

解决方案


它可能会帮助你解决你的问题....

DECLARE
CURSOR CUR_DAILY_UPDATE IS

select id, amount,status from trxn; 

REC_LON_UP CUR_DAILY_UPDATE%ROWTYPE;
BEGIN 
OPEN CUR_DAILY_UPDATE;
  LOOP
    FETCH CUR_DAILY_UPDATE INTO REC_LON_UP;
    EXIT WHEN CUR_DAILY_UPDATE%NOTFOUND;

        UPDATE trxn_dup FINAL_TAB
        SET FINAL_TAB.amount = REC_LON_UP.amount
        ,FINAL_TAB.status = REC_LON_UP.status
        WHERE FINAL_TAB.id = REC_LON_UP.id;   

  END LOOP;  
  COMMIT;
CLOSE CUR_DAILY_UPDATE;
END;

此块代码在 oracle 11g 中运行良好


推荐阅读