Mysql递归程序

时间:2014-01-10 15:36:26

标签: mysql sql stored-procedures recursion

我有一个表名为css_diectory,其中包含3列directory_id,directory-name和root_directory。我在这个表中存储分层目录结构。我编写了一个过程来检索给定directory_id的所有后代。但它不起作用。谁能帮帮我吗。 这是程序

CREATE PROCEDURE getDescendants
(IN rootId varchar(32), INOUT desecendantsFolderId varchar(3200))
   BEGIN
   DECLARE endOfRecord INTEGER DEFAULT 0;
   DECLARE folderId varchar(32) DEFAULT "";
   DECLARE folderName varchar(32) DEFAULT "";
   DECLARE folderCursor CURSOR FOR   
   Select directory_id, directory_name from css_directory where root_directory=rootId;

   DECLARE CONTINUE HANDLER FOR NOT FOUND SET endOfRecord = 1;
   OPEN folderCursor;
getFolderId: LOOP
             FETCH folderCursor INTO folderId, folderName;
             IF endOfRecord = 1 THEN 
             LEAVE getFolderId;
             END IF;
             Call getDescendants(folderId,desecendantsFolderId);
            SET desecendantsFolderId = CONCAT(folderId,",",desecendantsFolderId);
            call getDescendants(folderId,desecendantsFolderId);
END LOOP getFolderId;
END

编辑:此过程的输出始终为空集。它不会产生任何错误

1 个答案:

答案 0 :(得分:0)

我并非100%确定我会按照您的要求行事,但看起来这里有问题:

SET desecendantsFolderId = CONCAT(folderId,",",desecendantsFolderId);

CONCAT()的任何参数为null时,返回值为null。据推测,后代FolderId最初是空的,如果是这样,我就不知道它会发生什么变化。

有几种方法可以解决这个问题,但这里有一种方法:

SET desecendantsFolderId = NULLIF(CONCAT_WS(",",folderId,desecendantsFolderId),"");

CONCAT_WS()CONCAT()类似,除了第一个参数用作分隔符时,忽略第一个参数之外的空参数,如果所有后续参数都为空,则返回空字符串。基于其余代码,在技术上可能不需要NULLIF(),但如果输入参数确实都为空,则确保CONCAT_WS()的最终结果将返回null。