在PL/SQL中怎样判断查询的结果是否为空

iamlaosong文

在PL/SQL中会经常用到表的查询,然后针对查询结果进行处理。那么怎样判断查询的结果是否为空呢?用count(*)先查一次当然可以,可这样做就会多查询一次,如果仅仅一次倒是无关紧要,可是如果在循环中,那么就会大大延长处理时间,增加服务器负担。

1、只有一个查询结果的查询:

select min(to_char(b.arrive_date,'yyyymmdd')||lpad(b.arrive_time,6,0)||c.xs_mc)
  into vtmpstr
  from tb_evt_bag_mail_rela a, tb_evt_route_bag_rela b, tb_jgjm c
where a.mail_num = vmail_num

。。。。。。

对这个查询,只需判断变量vtmpstr是否为空就可以了,即:

if vtmpstr is null then

注意:查询中用聚合函数才可以这样用,如果直接取一个值,又没有结果,则会出错跳出模块,跑到例外处理那儿去了,如下面语句:

       select city_name into vcity_jdj
        from tb_county
       where xs_code=substr(vrcv_area,1,4);

如果没有查询结果,或者多个查询结果,都会出错跑到例外处理那儿,所以应该写成下面格式:

       select min(city_name) into vcity_jdj
        from tb_county
       where xs_code=substr(vrcv_area,1,4);

2、游标的查询结果:

      OPEN cur_get_trans(vin_date,vmail_num); 
      LOOP
        FETCH  cur_get_trans 
        INTO   vdeal_date,vdeal_time,vdeal_org_code,vlabel_strip,
               vmway_code,vflight_name,vdepart_date,vdepart_time;
--判断查询结果        
        if cur_get_trans%found then

。。。

       else

。。。

       end if;

或者退出循环处理,即:

      OPEN cur_get_trans(vin_date,vmail_num); 
      LOOP
        FETCH  cur_get_trans 
        INTO   vdeal_date,vdeal_time,vdeal_org_code,vlabel_strip,
               vmway_code,vflight_name,vdepart_date,vdepart_time;
        EXIT   WHEN cur_get_mail%NOTFOUND;

        --处理有结果的查询

       END LOOP;    

       --处理无结果的查询

       --注意,有查询结果处理完毕也会执行到此处,所以要区分上面是否进行过有结果的处理。                  
       CLOSE cur_get_trans;      

===================================================================

附:

1、游标相关的4个语句:

declare(声明)、open(打开)、fetch(取数)、close(关闭)。

2、游标相关的4个属性:%isopen, %found, %notfound,和 %rowcount

(1)%Isopen:布尔型,用于检测游标是否已经打开。如果游标已经打开,返回true,否则返回false。
(2)%found:布尔型,判断最近一次执行fetch语句后,是否从缓冲区中提取到数据,返回true,否则返回false。
(3)%notfound:与%found相反。
(4)%rowcount:数值型,返回到目前为止已经从游标缓冲区提取数据的行数。在fetch语句没有执行之前,该属性值为0。
使用隐式游标%found属性,sql%found;
使用显示游标%found属性,cur_get_trans%found


======================================================


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值