qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          關于Oracle游標的一些項目中遇到的邏輯問題

           今天 在項目中看一個存儲過程的時候,發現同事寫的之前的有些邏輯錯誤,可能這個錯誤比較典型吧 拿出來分享一下,不使用公司的數據庫,所以在自己的機子上模擬了一下這個場景。OK
            首先,就是2個表,
            表temp1,包括id1,val1,2個字段,
            表temp2,包括id2,val2 2個字段。
            首先,情景大致是這樣的,2個表的ID是有關聯的,就是把temp2中包含的temp1的id的數據,在temp1中把val1都設置為1,不包含的設置為0.
            首先,發一下之前錯誤的存儲過程。
          create or replace procedure mysdtest
          as
          cursor te_v1 is
          select id1,val1 from Temp1;
          cursor te_v2 is
          select id2,val2 from Temp2;
          v1_t te_v1%rowtype;
          v2_t te_v2%rowtype;
          begin
          open te_v1;
          loop
          fetch te_v1 into v1_t;
          exit when te_v1%notfound;
          open te_v2;
          loop
          fetch te_v2 into v2_t;
          exit when te_v2%notfound;
          if v1_t.id1=v2_t.id2
          then update temp1 set val1='1' where id1=v1_t.id1;
          else
          update temp1 set val1='0' where id1=v1_t.id1;
          end if;
          end loop;
          close te_v2;
          end loop;
          close te_v1;
          end;
            這樣寫邏輯是存在問題的,2層循環,結果就會發現都是0,仔細讀一下程序就會發現問題
            比如說有一個值 t1 在表temp1中有值,應該更新val1為1,但是遍歷到下一個t2時,此時t1不符合,然后就執行else 那么t1的val1就又變回了0,所以,程序執行完,都執行了else里面的,當然就錯了。

          正確的寫法很多種,這里我就以設置帶參數的游標為例,將2個游標建立關系,再進行遍歷就不會出現問題。
            如下:
          create or replace procedure myt
          as
          cursor te_v1 is
          select id1,val1 from Temp1;
          cursor te_v2(idv2 varchar2) is
          select count(*) from temp2 where id2=idv2;
          v1_t te_v1%rowtype;
          numv varchar2(2);
          begin
          open te_v1;
          loop
          fetch te_v1 into v1_t;
          exit when te_v1%notfound;
          open te_v2(v1_t.id1);
          fetch te_v2 into numv;
          if numv=0
          then
          update TEMP1 set val1='0' where id1=v1_t.id1;
          else
          update TEMP1 set val1='1' where id1=v1_t.id1;
          end if;
          close te_v2;
          end loop;
          close te_v1;
          end;
            ok,這種問題我們應該注意到

          posted on 2014-06-25 15:55 順其自然EVO 閱讀(137) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

          <2014年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 买车| 独山县| 卢氏县| 大方县| 湛江市| 肇源县| 万年县| 蒙山县| 德保县| 砚山县| 克拉玛依市| 子长县| 伊吾县| 大城县| 英吉沙县| 临汾市| 治多县| 八宿县| 石首市| 天等县| 江都市| 台中市| 清水县| 南丰县| 太谷县| 天全县| 新丰县| 新宾| 汤原县| 南江县| 锦州市| 兴山县| 从江县| 澜沧| 夹江县| 桦南县| 固镇县| 三亚市| 酒泉市| 石景山区| 昌黎县|