我有一个表名为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
编辑:此过程的输出始终为空集。它不会产生任何错误
答案 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。