免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2214 | 回复: 7
打印 上一主题 下一主题

写的存储过程,总是不能执行完?请高手指点! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-15 00:11 |只看该作者 |倒序浏览
过程如下:
create or replace procedure lc_wy_temp1_pro is
v_serv_id number;
v_cnt number:=0;

cursor lc_1 is select acc_nbr,rowid from lc_wy_temp1 where flag is null;

begin
       v_serv_id :=null;

      for c1 in lc_1 loop
         v_cnt:=v_cnt+1;
        begin
        select 1 into v_serv_id
               from lc_serv_t_20080514 where partition_id_region=1018 and state='F0A'
                       AND acc_nbr=c1.acc_nbr;

       insert into lc_111 (acc_nbr,serv_id) values (c1.acc_nbr,v_serv_id);
              
               
              if v_cnt=100 then
                 commit;
                 v_cnt:=0;
                 v_serv_id:=null;
               end if ;
               
         end ;
         end loop;
          commit;
        
end lc_wy_temp1_pro;


---这过程总再插入400行后退出,说是ORA-01403: no data found;
其实定义游标表里面有2万多记录。
是不是不能这样写啊??

论坛徽章:
0
2 [报告]
发表于 2008-05-15 09:03 |只看该作者
select 1 into v_serv_id
               from lc_serv_t_20080514 where partition_id_region=1018 and state='F0A'
                       AND acc_nbr=c1.acc_nbr;


很显然,是这个语句执行时候抛出了 NO_DATA_FOUND 的异常了
redbat 该用户已被删除
3 [报告]
发表于 2008-05-15 09:55 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2008-05-15 10:56 |只看该作者
符合partition_id_region=1018 and state='F0A' AND acc_nbr=c1.acc_nbr的行不存在

论坛徽章:
0
5 [报告]
发表于 2008-05-15 12:29 |只看该作者
这个算法可以不用循环做的,会没有这些麻烦的。

论坛徽章:
0
6 [报告]
发表于 2008-05-15 12:57 |只看该作者
是可以不用循环做。但是,为什么出现no_data_found感觉很奇怪!
自己写的insert into lc_111 (acc_nbr,serv_id) values (c1.acc_nbr,v_serv_id);
也只是为了看看能不能执行成功。
写这个程序是为了update表lc_wy_temp1 ;
如果过程这样写,就没问题!
--------
create or replace procedure wy_temp1_pro
is
v_cnt number:=0;
v_createidx varchar2(500);

cursor wy_1 is SELECT acc_nbr,ROWID FROM WY_temp1 WHERE flag is NULL;       


begin
    for c1 in wy_1 loop
     v_cnt:=0;
     UPDATE WY_temp1 a SET
(serv_id,flag)
=
(SELECT serv_id,1
FROM serv_t@to_sidsvc2
  WHERE acc_nbr=c1.acc_nbr AND partition_id_region=1018
    AND state='F0A')
WHERE ROWID=c1.ROWID;
   v_cnt := v_cnt+1;   
   IF v_cnt=100 THEN
      BEGIN
             v_cnt:=0;
             COMMIT;
      END;      
   END IF;  
        END LOOP;
COMMIT;

v_createidx:='create index idx_wytemp1a on wy_temp1(serv_id)';
execute immediate v_createidx;

end ;


----------搞不懂为什么会出现:符合partition_id_region=1018 and state='F0A' AND acc_nbr=c1.acc_nbr的行不存在

论坛徽章:
0
7 [报告]
发表于 2008-05-15 13:30 |只看该作者
那就调试一下嘛,看看到底为什么……

论坛徽章:
0
8 [报告]
发表于 2008-05-15 13:31 |只看该作者
acc_nbr=c1.acc_nbr;
两边的类型是否一致,尤其要注意char和varchar
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP