落地时间         公司     库存量     前周库存量
20121202 T 45
20121203 T 66
20121204 T 22
20121125 V 78
上面是表结构,类型:落地时间varchar2(20),公司varchar2(200),库存量number.脚本如下:
declare 
cursor get_row is select 落地时间, 公司,库存量 
from AAATEST;
v1 get_row%rowtype;
cc varchar2(200);
tt varchar2(20);
last_week number:=0;
begin
open get_row;
loop fetch get_row into v1;
exit when get_row %notfound;begin
select 公司,落地时间, sum(库存量)/7 
into cc,tt,last_week
from AAATEST
where 公司=v1.公司 and 落地时间 between
to_char(to_date( v1.落地时间,'yyyymmdd')) and 
to_char(to_date(v1.落地时间,'yyyymmdd')-7)
group by 公司,落地时间;update AAATEST
set 前周库存量=last_week
where 公司=v1.公司 and 落地时间=v1.落地时间;
commit;end; 
end loop;
close get_row;end;
但总出现ORA_01403 未找到数据的错误提示试了加异常处理,但只更新的小部分数据,或出现ORA_01422等等一系列的问题,感觉自己的逻辑出现了问题,求各位给出一个好的思路,正确的脚本,谢谢了,在线等!

解决方案 »

  1.   

    不好意思,刚才代码还是没看仔细,建议直接用游标更新数据,如下
    declare
      cursor AAATEST_cur is
        select * from AAATEST for update of 前周库存量 nowait;
      v_lastweek number;
    begin
      for r in AAATEST_cur loop
        select sum(库存量)
          into v_lastweek
          from AAATEST
         where 落地时间 between to_date(r.落地时间, 'yyyymmdd') - 7 and
               to_date(r.落地时间, 'yyyymmdd')
               and 公司=r.公司;
        update AAATEST
           set 前周库存量 = v_lastweek
         where current of AAATEST_cur;
      end loop;
      

  2.   

    修正一下第10行 的where条件
    加了一个commit,测试成功
    declare
      cursor AAATEST_cur is
        select * from AAATEST for update of 前周库存量 nowait;
      v_lastweek number;
    begin
      for r in AAATEST_cur loop
        select sum(库存量)
          into v_lastweek
          from AAATEST
         where to_date(落地时间,'yyyymmdd') between to_date(r.落地时间, 'yyyymmdd') - 7 and
               to_date(r.落地时间, 'yyyymmdd')
               and 公司=r.公司;
        update AAATEST
           set 前周库存量 = v_lastweek
         where current of AAATEST_cur;
      end loop;
      commit;
      end ;
      

  3.   

    非常感谢,但是我还想再补充问一下,其实这张表还表两列,一列是前日库存量,另一列是前30天的库存量,是定义三个游标完成,还是可以使用这一个游标完成呢?以前没用过游标获取表时使用update 这种形式的,为什么for 中可以使用AAATEST_cur呢?
      

  4.   

    不需要三个游标,如法炮制就好,多定义几个变量,几个select ..into语句
    update语句中适当修改