在Oracle中可以使用CONNECT BY子句可以輕鬆的實現遞迴查詢,在MSSQLServer和DB2中則可以使用WITH子句來實現遞迴查詢,MYSQL中即不支援CONNECT BY子句也不支援WITH子句,所以要實現遞迴查詢就必須使用其他的方式來變通實現, 而且實現方案也隨需求的不同而有差異。
下為mysql 使用程式過程的 遞迴執行個體(互連網整理),
1.建立表
DROP TABLE IF EXISTS `item_category`;
CREATE TABLE `item_category` (
`id` int(11) NOT NULL auto_increment,
`catId` int(11) default NULL,
`parentId` int(11) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=REDUNDANT;
2,插入資料
INSERT INTO `item_category` VALUES (1,1,0);
INSERT INTO `item_category` VALUES (2,2,1);
INSERT INTO `item_category` VALUES (3,3,1);
INSERT INTO `item_category` VALUES (4,4,2);
INSERT INTO `item_category` VALUES (5,5,3);
3.建立預存程序
DELIMITER //
drop procedure if exists findLChild//
CREATE PROCEDURE findLChild(iid bigint(20),layer bigint(20))
BEGIN
create temporary table if not exists tmp_table (id bigint(20));
SET@@max_sp_recursion_depth=99;
call iterative(iid,layer);
select * from tmp_table;
drop temporary table if exists tmp_table;
END;//
DELIMITER ;
DELIMITER //
drop procedure if exists iterative//
CREATE PROCEDURE iterative(iid bigint(20),layer bigint(20))
BEGIN
declare tid bigint(20) default -1;
declare cur1 CURSOR FOR select catId from item_category where parentId=iid;
declare CONTINUE HANDLER FOR SQLSTATE '02000' SET tid = null;
if layer > 0 then
OPEN cur1;
FETCH cur1 INTO tid;
WHILE(tid is not null)
DO
insert into tmp_table values(tid);
call iterative(tid,layer-1);
FETCH cur1 INTO tid;
END WHILE;
end if;
END;//
DELIMITER ;
4.調用
call findLChild(1,50);
5 java 調用
用JAVA執行預存程序並取得結果集的代碼如下:
Connection con = new Connection();----假設這裡已經取得一個有效串連.
ResultSet rs=null;
CallableStatement cstm = con.prepareCall("{CALL testrs(?)}");
cstm.setInt(1,2);----將預存程序的第一個參數填儲值2.
boolean bl = cstm.execute();-----執行預存程序
while(bl){----若預存程序成功執行了,並且有結果集返回了,那麼bl就是true
rs=cstm.getResultSet()----取得一個結果集,
while(rs.next()){
System.out.println(rs.getInt(1));--- 隨便輸出一個值。
}
bl=cstm.getMoreResultSet();----若還能取得結果集,則bl=true,這樣就回到迴圈首部,繼續取得結果集進行處理,若不再有結果集了,則bl=false。結果迴圈。
這樣,只要三次迴圈,這個預存程序的三個結果集就可以被分別渠道並處理了。