Oracle9i中关于select into的执行过程

天查询一些内容,发现一些内容不对头,找来找去,发现是select into 的问题。 
 原来的代码是这样的,外面的大循环就不再多写了(我的环境是9iR2)
 begin
     --获得自己的基本信息
     SELECT ParentCode,ID,grade INTO V_ParentCode,
                 V_ID,V_GRADE FROM TDEPTS WHERE DEPTCODE=P_DEPTCODE;     
     BEGIN          
        --Oracle 的 bug还是问题了?
        SELECT ParentCode INTO V_ParentCode FROM TDEPTS WHERE FID=V_ID AND ROWNUM<=1;
     EXCEPTION
        WHEN OTHERS THEN
           null

     END;
  exception
     when others then
        --当作没有下级
        return 1;
  end; 

       在调试的时候,发现变量V_ParentCode还是保留了原来的内容(原来不是空的),这样导致在后来的操作中出现了自己意料之外的内容。

        例如上次调用的时候V_PARENTCODE='0001',本次调用返回异常,则V_PARENTCODE还是'0001';

       不得已,进行了一些调整:

  ---------------------------

 begin 
     SELECT ParentCode,ID,grade INTO V_ParentCode,
                 V_ID,V_GRADE FROM TDEPTS WHERE DEPTCODE=P_DEPTCODE;      
     BEGIN          
        SELECT ParentCode INTO V_SUBParentCode FROM TDEPTS WHERE FID=V_ID AND ROWNUM<=1;
     EXCEPTION
        WHEN OTHERS THEN
           V_SUBParentCode:=NULL;  --必须手工设置为null,否则可能保持原来的内容
                             --到底是什么意思
     END;
  exception
     when others then
        --当作没有下级
        return 1;
  end;

       最重要的改动是红色字体部分。 V_SUBParentCode初始化的时候是空的。所以,如果没有数据的话,还是空的。

       结果就对了。  但为什么这样了?  难道是因为有了意外处理?。。。。
       --
      后来发现在10g中也是如此,这么看来,只能是说,select into 的过程是分两步的:
     1)查询出数据,如果有异常,引发异常.
     2)把查询的结果赋予变量.

     在第一步中如果没有活得数据则直接的跳跃到异常处理部分,只有这样的解释才能说明为什么变量还是保留前次的状态.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值