【问题标题】:Mysql recursive procedureMysql递归过程
【发布时间】:2014-01-29 15:51:17
【问题描述】:

我有一个包含 3 列 directory_id、目录名和 root_directory 的表名 css_diectory。我在此表中存储分层目录结构。我编写了一个程序来检索给定 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

编辑:这个过程的输出总是一个空集。它不会产生任何错误

【问题讨论】:

  • 请比“它不起作用”更具体。此外,您可能会检查结尾附近“flderId”中的拼写错误。
  • 这不仅仅是打字错误。我编辑了问题。

标签: mysql sql stored-procedures recursion


【解决方案1】:

我不能 100% 确定我是否遵循您的操作,但这里似乎有问题:

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

CONCAT() 的任何参数为空时,返回值为空。大概 descendantsFolderId 最初为 null,如果是这样,我看不出它会在哪里改变。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 2019-02-10
    相关资源
    最近更新 更多