為 了更好的查詢一個樹狀結構的表,在Oracle的PL/SQL中提供樂一個誘人的特性——CONNECT BY子句。它大大的方便了我們查找樹狀表:遍歷一棵樹、尋找某個分支......,但還是存在一些不足。在Oracle 10G,就對這個特性做了增強。下面就舉例說明一下。
樹狀一般都是在一條記錄中記錄一個當前節點的ID和這個節點的父ID來實現。但是,一旦數據中出現了循環記錄,如兩個節點互為對方父節點,系統就會報ORA-01436錯誤,例如:
insert into t_tonedirlib(dirindex, fatherindex, dirname, status) values (666, 667, '123', 5);
insert into t_tonedirlib(dirindex, fatherindex, dirname, status) values (667, 666, '456', 5);
select dirindex, fatherindex, RPAD(' ', 2*(LEVEL-1)) || dirname from t_tonedirlib
start with fatherindex = 666
connect by fatherindex = prior dirindex;
select CONNECT_BY_ISCYCLE, dirindex, fatherindex, RPAD(' ', 2*(LEVEL-1)) || dirname
from t_tonedirlib
start with fatherindex = 666
connect by NOCYCLE fatherindex = prior dirindex
CONNECT_BY_ISCYCLE DIRINDEX FATHERINDEX RPAD(' ',2*(LEVEL-1))||dirname
;
----------------- ---------------- ---------------------------------
0 667 666 456
1 666 667 123
2 rows selected