ITPUB??ì3
12月微软Hyper-V虚拟化沙龙主题征集
ITPUB论坛 » Oracle开发 » 一个sql问题

标题: 一个sql问题
离线 Arraywljcan
一般会员



精华贴数 0
个人空间 0
技术积分 242 (8058)
社区积分 2 (23375)
注册日期 2001-11-27
论坛徽章:0
      
      

发表于 2002-1-8 17:48 
一个sql问题

在写过程时,我用如下语句:

  select  table_Name into v_tableName  from tablename  where table_id=100;

如果以上条件返回记录数为0,将提示错误,于是,我在前面加了一个判断
   select  count(table_Name) into v_count  from tablename  where table_id=100;
      if v_count>0 then
            select  table_Name into v_tableName  from tablename  where  table_id=100;
      end if;

但这种方式效率太低了,不知各位高手有没有好的办法?

   谢谢!




只看该作者    顶部
离线 oldwain
老了,不狂热了。


来自 神秘的地方
精华贴数 19
个人空间 0
技术积分 24848 (39)
社区积分 5106 (297)
注册日期 2001-9-24
论坛徽章:13
管理团队成员ITPUB长老会成员ITPUB元老Heart of PUBITPUB维基人itpub2007年荐股参与纪念徽章
ITPUB新首页上线纪念徽章     

发表于 2002-1-8 17:53 
PHP code:


begin

  select table_Name into v_tableName from tablename where table_id
=100

exception when no_data_found then

  
........

end;




__________________
      ▇▇▇▇▇▇▇
      ▇ITPUB▇
       ▇老 ☆ O▇
      ▇灌水专用章▇
      ▇▇▇▇▇▇▇
       我  思   我 在


投资理财| BLOG天地| WIKI世界| WEB 2.0技术|  我的BLOG! | 我的group | 订阅我的blog: RSS
blog最新文章:  (New!)封闭式基金的投资价值
       从喝羊肉汤看基本面选股
       我的投资经历(1 认购证)(2 赣江铃)(3 琼民源)(4 519行情)(5 B股)(6 股改)
只看该作者    顶部
离线 wljcan
一般会员



精华贴数 0
个人空间 0
技术积分 242 (8058)
社区积分 2 (23375)
注册日期 2001-11-27
论坛徽章:0
      
      

发表于 2002-1-9 09:12 
我这个问题可能比较复杂,因为有多个对变量赋值的语句

如果用错误捕获的方式,在处理如下语句可能就比较麻烦,如:
declare
   .....
begin
    select table_Name into v_tableName from tablename where table_id=100;
    insert into tableTemp (table_name,id) values (v_tableName ,100);
   
    select table_id into v_tableid  from othertable where  table_name='ABC';
    insert into tableTemp (table_name,id) values ('ABC' ,v_tableid);
  end;

  以上过程如果使用错误捕获方式,如何知道是哪一句出错呢?


只看该作者    顶部
离线 ericlma
中级会员



精华贴数 0
个人空间 0
技术积分 274 (7206)
社区积分 0 (49256)
注册日期 2001-11-16
论坛徽章:1
授权会员     
      

发表于 2002-1-9 09:28 
My rule of thumb:

1. Never use SELECT statements (except SELECT COUNT(...)) directly in the body of PL/SQL block.  Declare cursors instead.

2. Avoiding putting regular business logic in the exception handlers.  Exception handlers should contain code that cleans up system resources and raises the exception up the call stack.


只看该作者    顶部
离线 oldwain
老了,不狂热了。


来自 神秘的地方
精华贴数 19
个人空间 0
技术积分 24848 (39)
社区积分 5106 (297)
注册日期 2001-9-24
论坛徽章:13
管理团队成员ITPUB长老会成员ITPUB元老Heart of PUBITPUB维基人itpub2007年荐股参与纪念徽章
ITPUB新首页上线纪念徽章     

发表于 2002-1-9 09:59 
Re: 我这个问题可能比较复杂,因为有多个对变量赋值的语句



QUOTE:
最初由 wljcan 发布

  以上过程如果使用错误捕获方式,如何知道是哪一句出错呢?


为每一段语句分别进行例外处理即可.

begin
  select ...........
exception when no_data_found then
  ........
end;

begin
  select ...........
exception when no_data_found then
  ........
end;


或者, 另一个方法, 设置一个变量, 执行到每个语句, 为该变量赋以不同的值, 在例外中判断.


begin
  v_tmp := 1;
  select ...........

  v_tmp := 2;
  select ...........

exception when no_data_found then
  if v_tmp = 1 then
     ........
  elsif v_tmp = 2 then
    ..........
  else
    ..........
  end if;
end;


__________________
      ▇▇▇▇▇▇▇
      ▇ITPUB▇
       ▇老 ☆ O▇
      ▇灌水专用章▇
      ▇▇▇▇▇▇▇
       我  思   我 在


投资理财| BLOG天地| WIKI世界| WEB 2.0技术|  我的BLOG! | 我的group | 订阅我的blog: RSS
blog最新文章:  (New!)封闭式基金的投资价值
       从喝羊肉汤看基本面选股
       我的投资经历(1 认购证)(2 赣江铃)(3 琼民源)(4 519行情)(5 B股)(6 股改)
只看该作者    顶部
离线 wljcan
一般会员



精华贴数 0
个人空间 0
技术积分 242 (8058)
社区积分 2 (23375)
注册日期 2001-11-27
论坛徽章:0
      
      

发表于 2002-1-9 10:53 
谢谢

虽然这个方法也不太理想,但是比我原来的方法要好得多了


只看该作者    顶部
离线 olive
高级会员


精华贴数 1
个人空间 0
技术积分 4252 (339)
社区积分 8314 (192)
注册日期 2002-1-9
论坛徽章:14
会员2007贡献徽章会员2006贡献徽章生肖徽章2007版:猴2008北京奥运纪念徽章:蹦床2008年新春纪念徽章操作系统板块每日发贴之星
操作系统板块每日发贴之星     

发表于 2002-1-9 11:48 
可以在select之后用sqlerr的返回码判断。


__________________
下面这句话是真的
上面那句话是假的
只看该作者    顶部
离线 wljcan
一般会员



精华贴数 0
个人空间 0
技术积分 242 (8058)
社区积分 2 (23375)
注册日期 2001-11-27
论坛徽章:0
      
      

发表于 2002-1-9 11:58 
sqlerr?如何使用,能不能举例说明一下?

谢谢


只看该作者    顶部
离线 andronicus
初级会员



精华贴数 0
个人空间 0
技术积分 50 (27815)
社区积分 6 (13850)
注册日期 2002-1-9
论坛徽章:0
      
      

发表于 2002-1-10 16:31 
判断sqlcode是否为1403就可以了吧?我这是在pro*c中用的,不知道plsql能不能用


只看该作者    顶部
离线 流云飞天
孤影萍踪



精华贴数 0
个人空间 0
技术积分 186 (10122)
社区积分 0 (51176)
注册日期 2002-1-10
论坛徽章:0
      
      

发表于 2002-1-10 16:34 
我的方案是……

在语句
select count(table_Name) into v_count from tablename where table_id=100;
中加入一个条件 rownum=1
然后再判断 if v_count>0 then …… end if;
这样,统计记录条数时,遇到第一个符合条件的记录就返回。很方便。


__________________
忧郁的眼睛真诚的心,相识相知愿与君。redsun_shine@sina.com路漫漫,吾上下而求索之修者,远兮!小的时候,不知道理想是什么;长大以后,又不知什么是理想……
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问