CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Oracle >  开发

大G们,我遇到了个存储过程的问题,今天就要交任务了,救救小M啊,在线急等

楼主redbean56(红豆)2004-09-03 10:50:46 在 Oracle / 开发 提问

CREATE   OR   REPLACE   PROCEDURE   LBAS.P_QQ_INTERFACE_FILTER  
  (ll_calling_nbr   VARCHAR2,   ll_called_nbr   VARCHAR2,   ll_pass   out   number   )  
  IS  
      calling_area_id   NUMBER(12,0);  
      called_area_id   NUMBER(12,0);  
      calling_type   NUMBER(12,0);  
      called_type     NUMBER(12,0);  
      ll_count           integer;  
  BEGIN    
           .  
              .  
                                        .  
      select   area_id  
      into   calling_area_id  
      from   acct  
      where   acc_nbr   =ll_calling_nbr  
      and   state   =   '10A';  
       
      select   area_id  
      into   called_area_id  
      from   acct  
      where   acc_nbr   =   ll_called_nbr  
      and   state   =   '10A';  
                                            .  
                                            .  
                                            .  
                                            .  
  END;  
  如果检索不出数据,则会报错,错误是:"at   end   of   the   table"  
   
  这是我写的第一个存储过程,谢谢你们啦!  
   
  .  
  问题点数:100、回复次数:7Top

1 楼bzszp(SongZip)回复于 2004-09-03 10:57:36 得分 10

加上exception   when   no_data_found   的例外处理  
  如:  
  10:47:03   SQL>   declare  
  10:47:07       2     v   number;  
  10:47:07       3     begin  
  10:47:07       4     select   aaa   into   v   from   t   where   1=2;  
  10:47:13       5     end;  
  10:47:14       6     /  
  declare  
  *  
  ERROR   位于第   1   行:  
  ORA-01403:   未找到数据  
  ORA-06512:   在line   4  
   
   
  已用时间:     00:   00:   00.63  
  10:47:14   SQL>   declare  
  10:47:17       2     v   number;  
  10:47:17       3     begin  
  10:47:17       4     select   aaa   into   v   from   t   where   1=2;  
  10:47:18       5     exception   when   no_data_found   then  
  10:47:30       6       dbms_output.put_line('no   data   found!');  
  10:47:54       7     end;  
  10:47:56       8     /  
  no   data   found!  
   
  PL/SQL   过程已成功完成。  
   
  已用时间:     00:   00:   00.47  
  10:47:57   SQL>Top

2 楼lialin(阿林)回复于 2004-09-03 11:14:18 得分 10

你可以先判断一下,有数据的话再进行这个操作,要不就用异常保护,如楼上的!Top

3 楼LGQDUCKY(飘)回复于 2004-09-03 11:35:05 得分 20

CREATE   OR   REPLACE   PROCEDURE   LBAS.P_QQ_INTERFACE_FILTER  
  (ll_calling_nbr   VARCHAR2,   ll_called_nbr   VARCHAR2,   ll_pass   out   number   )  
  IS  
      calling_area_id   NUMBER(12,0);  
      called_area_id   NUMBER(12,0);  
      calling_type   NUMBER(12,0);  
      called_type     NUMBER(12,0);  
      ll_count           integer;  
  BEGIN    
        begin   .  
            select   area_id  
      into   calling_area_id  
      from   acct  
      where   acc_nbr   =ll_calling_nbr  
      and   state   =   '10A';  
       .  
                      EXCEPTION  
                          when   no_data_found   then    
                                  NULL;  
        when   others   then    
  raise_application_error(   -20232,   '出错'||sqlerrm   )   ;  
                    END;        
  begin        
      select   area_id  
      into   called_area_id  
      from   acct  
      where   acc_nbr   =   ll_called_nbr  
      and   state   =   '10A';  
                        EXCEPTION  
                          when   no_data_found   then    
                                    NULL;  
        when   others   then    
  raise_application_error(   -20233,   '出错'||sqlerrm   )   ;  
        END;                           .  
                                            .  
                                            .  
                                            .  
  END;  
   
   
  不管用什么开发工具异常肯定是要捕捉处理的,Top

4 楼lx1116(阿牛)回复于 2004-09-03 12:29:56 得分 20

/*建议不用select   into    
  原因:会有2中异常  
  <1>no_data_found  
  <2>too_many_rows  
  建议用显示游标*/  
  create   or   replace   procedure   LBAS.P_QQ_INTERFACE_FILTER  
  (  
  ll_calling_nbr   in     varchar2   , --建议->   表名.列名%type  
  ll_called_nbr     in     varchar2   ,                 --同上  
  ll_pass                 out   number  
  )  
  is  
  calling_area_id number(12,0);  
  called_area_id number(12,0);  
  calling_type number(12,0);  
  called_type number(12,0);  
  ll_count integer;  
   
  exp_cs1   exception   ; --自定义异常第一个查询  
  exp_cs2   exception   ; --自定义异常第二个查询  
   
  --定义游标cs1  
  cursor   cs1   is    
  select   area_id  
      from   acct  
    where   acc_nbr   =   ll_calling_nbr  
        and   state   =   '10A';  
   
  --定义游标cs2  
  cursor   cs1   is    
  select   area_id  
      from   acct  
    where   acc_nbr   =   ll_called_nbr  
        and   state   =   '10A';  
  begin  
  --把area_id赋值给变量calling_area_id  
  for   for_cs1   in   cs1    
  loop  
  calling_area_id :=   for_cs1.area_id   ;  
  exit   ; --在只有一条记录的情况下用exit  
  end   loop   ;  
  if   calling_area_id   is   null   then  
  raise   exp_cs1   ;  
   
  --把area_id赋值给变量called_area_id  
  for   for_cs2   in   cs2    
  loop  
  called_area_id   :=   for_cs1.area_id   ;  
  exit   ; --在只有一条记录的情况下用exit  
  end   loop   ;  
  if   called_area_id   is   null   then  
  raise   exp_cs2   ;  
  exception  
  when   exp_cs1   then  
  ll_pass   :=   1   ;   --自由发挥,表示第一个查询出错,具体根据实际定  
  when   exp_cs2   then  
  ll_pass   :=   2   ;   --同上  
   
  when   others   then  
  ll_pass   :=   3   ;   --其他错误!以上错误可以得到sqlcode、sqlerrm并记录下来    
   
  end;Top

5 楼dejkstro(立刻死臭)回复于 2004-09-03 18:04:55 得分 10

EXCEPTION   WHEN   NO_DATA_FOUND   THEN  
        你的操作;Top

6 楼wylwyl1130(落雪山林)回复于 2004-09-03 18:07:48 得分 10

MM就是MM,这么多GG来捧场,呵呵Top

7 楼yujiabian(流氓兔子雨)回复于 2004-09-04 13:13:12 得分 20

 
  CREATE   OR   REPLACE   PROCEDURE   LBAS.P_QQ_INTERFACE_FILTER  
  (ll_calling_nbr   VARCHAR2,   ll_called_nbr   VARCHAR2,   ll_pass   out   number   )  
  IS  
      calling_area_id   NUMBER(12,0);  
      called_area_id   NUMBER(12,0);  
      calling_type   NUMBER(12,0);  
      called_type     NUMBER(12,0);  
      ll_count           integer;  
  BEGIN    
        begin   .  
            select   area_id  
      into   calling_area_id  
      from   acct  
      where   acc_nbr   =ll_calling_nbr  
      and   state   =   '10A';  
       .  
                      EXCEPTION  
                          when   no_data_found   then    
                                  NULL;  
        when   others   then    
  raise_application_error(   -20232,   '出错'||sqlerrm   )   ;  
                    END;        
  begin        
      select   area_id  
      into   called_area_id  
      from   acct  
      where   acc_nbr   =   ll_called_nbr  
      and   state   =   '10A';  
                        EXCEPTION  
                          when   no_data_found   then    
                                    NULL;  
        when   others   then    
  raise_application_error(   -20233,   '出错'||sqlerrm   )   ;  
        END;                           .  
                                            .  
                                            .  
                                            .  
  END;  
   
   
  不管用什么开发工具异常肯定是要捕捉处理的,  
   
       
  赞同这个观点!!!!!Top

相关问题

  • 大家救救我 要崩溃了 我的存储过程
  • 关于在PB中应用SQl Server的系统存储过程.救救我吧!!
  • 关于在PB中应用SQl Server的系统存储过程.救救我吧!!!
  • 存储过程
  • 存储过程
  • 存储过程
  • 存储过程
  • 存储过程
  • 存储过程
  • 存储过程

关键词

  • 数据
  • exp
  • nbr
  • area
  • ll
  • called
  • sqlerrm
  • 游标
  • cs
  • 出错

得分解答快速导航

  • 帖主:redbean56
  • bzszp
  • lialin
  • LGQDUCKY
  • lx1116
  • dejkstro
  • wylwyl1130
  • yujiabian

相关链接

  • Oracle类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo