熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

用Oracle10g新層次偽列探查層次循環

2013-11-13 22:21:22  來源: Oracle 

  在上一篇文章中我說明了如何分類層次化查詢中的輸入項但是要使一個層次化查詢得以運行就不能使數據返回到自身也就是說一個母行不能把自己或它的一個子行作為自己的母行如果發生這種情況Oracle將重復不斷地執行這個鏈接永遠無法到達一個確定的終點

  幸運的是Oracle對這種情況進行測試並用以下錯誤信息中止查詢

  ORA: CONNECT BY loop in user data

  過去我們很難發現一個大型數據集中的所有行彼此引用因為查詢在發現第一個循環時就已經終止在Oracle g中SELECT語句的兩個新語法元素為你提供了解決這類數據錯誤的工具NOCYCLE和CONNECT_BY_ISCYCLE

  CONNECT BY子句中增加的NOCYCLE參數指出即使探查到一個循環Oracle無論如何也要返回一個行這為查明哪個行出錯提供了極有價值的線索(不用擔心——Oracle會停止評估循環轉向下一行如果當前的行包含一個循環CONNECT_BY_ISCYCLE偽列將返回否則將返回組合使用這兩個元素就能查明需要修復的內容

  列表A是和上一篇文章中相同的層次化查詢我們根據HR樣本方案執行它

  這次我們在數據中介紹另一個循環將員工Kochhar()改為向Urman()報告Urman向Greenberg()報告Greenberg則向Kochhar報告從而建立一個循環

  UPDATE employees

  SET manager_id =

  WHERE employee_id = ;

  COMMIT;

  如果我們重新運行上述查詢將得到ORA錯誤列表B探查我們介紹的錯誤我們沒有使用CONNECT BY PRIOR而是使用了CONNECT BY NOCYCLE PRIOR即使探查到一個循環它仍然會繼續進行查詢我們還在報告中增加了manager_id列和CONNECT_BY_ISCYCLE偽列以幫助解決這個問題

  輸出結果在Urman行顯示回溯循環鏈我們就能發現出錯的地方Kochhar那一行

  column Reports To format a
set pagesize

SELECT LPAD( *(LEVEL))||last_name Reports To employee_id
FROM employees
START WITH employee_id IN ( )
CONNECT BY PRIOR employee_id = manager_id
/

Reports To                     EMPLOYEE_ID                                     
                                     
De Haan                                                                     
  Hunold                                                                    
    Austin                                                                   
    Ernst                                                                   
    Lorentz                                                                 
    Pataballa                                                                
Kochhar                                                                     
  Baer                                                                      
  Greenberg                                                                  
    Chen                                                                    
    Faviet                                                                  
    Popp                                                                    
    Sciarra                                                                 
    Urman                                                                   
      Kochhar                                                               
ERROR:
ORA: CONNECT BY loop in user data

  Bob Watkins(OCPMCDBAMCSEMCT)是一位有年經驗的計算機專業人士從事過技術培訓師顧問與數據庫管理員等職


From:http://tw.wingwit.com/Article/program/Oracle/201311/18866.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.