• 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)把查询的结果赋予变量.

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

  • 相关阅读:
    JSONP原理
    什么是跨域,如何解决
    工程化与模块化开
    vue双向数据绑定原理
    vuex原理
    BFC 原理
    http状态码 301、302区别
    用户页面打开很慢,有哪些优化方式?
    webpack打包
    Promise 原理
  • 原文地址:https://www.cnblogs.com/linximf/p/2294322.html
Copyright © 2020-2023  润新知