2012-12-06 55 views
1

被困在這約2小時,我有這個程序,它需要一個邊和一個集合,並返回一個布爾leaf來測試某個節點是否是葉。該測試只適用於左節點不過,一旦我進入它打破了第二圈,我想不通爲什麼:使用MySQL測試葉節點

CREATE PROCEDURE `is_leaf`(IN `edge` VARCHAR(12), IN `eset` VARCHAR(512), OUT `leaf` INT) 
BEGIN 

declare lnode char(6) default substring_index(edge, ':', 1); -- left node of edge. 
    declare rnode char(6) default substring_index(edge, ':', -1); -- right node of edge. 
    declare cedge char(12); 
    declare lnode_in_cedge char(6); 
    declare rnode_in_cedge char(6); 
    declare found int default 1; 
    declare OGset varchar(512) default ''; 
    SET OGset= concat('',eset); 

--CHECKS LEFT NODE OF EDGE AGAINST ALL EDGES IN SET 
WHILE length(eset)!=0 AND found!=2 DO 
set cedge = substring_index(eset, ',', 1); 
SET lnode_in_cedge= substring_index(cedge, ':', 1); 
SET rnode_in_cedge= substring_index(cedge, ':', -1); 

--IF LEFT NODE IS FOUND TO HAVE COMMON VERTEX, THE SAME TEST IS RUN FOR THE RIGHT ONE 
IF lnode= lnode_in_cedge OR lnode= rnode_in_cedge THEN 
    BEGIN 
     SET leaf=false; 

    SET eset= OGset; 
    WHILE length(eset)!=0 AND found !=2 DO 
    set cedge = substring_index(eset, ',', 1); 
    SET lnode_in_cedge= substring_index(cedge, ':', 1); 
    SET rnode_in_cedge= substring_index(cedge, ':', -1); 
     IF rnode= lnode_in_cedge OR rnode= rnode_in_cedge THEN 
      BEGIN 
      SET leaf= false; 
      SET found= 2; 
      END; 
     END IF; 
     SET eset = REMOVE_FIRST(eset); 
    END WHILE; 
    END; 
END IF; 

SET eset = REMOVE_FIRST(eset); 
END WHILE; 



IF found=1 THEN 
SET leaf=true; 
END IF; 


END 

回答

0

我把它打破了循環工作,如果有人發現一個原因之前的代碼無法讓我知道。我不太瞭解MySQL中的嵌套循環。以下是工作代碼:

CREATE PROCEDURE `is_leaf`(IN `edge` VARCHAR(12), IN `eset` VARCHAR(512), OUT `leaf` INT) 
BEGIN 

declare lnode char(6) default substring_index(edge, ':', 1); -- left node of edge. 
    declare rnode char(6) default substring_index(edge, ':', -1); -- right node of edge. 
    declare cedge char(12); 
    declare lnode_in_cedge char(6); 
    declare rnode_in_cedge char(6); 
    declare found int default 1; 
    declare OGset varchar(512) default ''; 
    SET OGset= concat('',eset); 

WHILE length(eset)!=0 DO 
set cedge = substring_index(eset, ',', 1); 
SET lnode_in_cedge= substring_index(cedge, ':', 1); 
SET rnode_in_cedge= substring_index(cedge, ':', -1); 
IF lnode= lnode_in_cedge OR lnode= rnode_in_cedge THEN 
    set found=0; 
END IF; 

SET eset = REMOVE_FIRST(eset); 
END WHILE; 

IF found=0 THEN 
BEGIN 
    SET eset= OGset; 
    WHILE length(eset)!=0 DO 
    set cedge = substring_index(eset, ',', 1); 
    SET lnode_in_cedge= substring_index(cedge, ':', 1); 
    SET rnode_in_cedge= substring_index(cedge, ':', -1); 
     IF rnode= lnode_in_cedge OR rnode= rnode_in_cedge THEN 
      BEGIN 
      SET leaf= false; 
      SET found= 2; 
      END; 
     END IF; 
     SET eset = REMOVE_FIRST(eset); 
    END WHILE; 
END; 
END IF; 


IF found!=2 THEN 
SET leaf=true; 
END IF; 


END