create testFunc(entityId numeric(10),ids char(255))
returns char(255)
BEGIN
    DECLARE strID NUMERIC(10);
    DECLARE tempIds CHAR(255);
    DECLARE done INT DEFAULT 0;
    DECLARE parts_cur CURSOR
    FOR
    SELECT myEntityId FROM NeiEntityContainmentTable WHERE entityid = entityID;
    -- FOR READ ONLY
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
    set tempIds = ids;
    OPEN parts_cur;
    FETCH parts_cur INTO strID;
    WHILE(done = 0) DO
        set tempIds = concat(rtrim(tempIds),',');
set tempIds = concat(tempIds, rtrim(cast(strID as char(10))));
        set tempIds =  testFunc(strID,tempIds);
        FETCH parts_cur INTO strID;
    END WHILE;
    CLOSE parts_cur;
    RETURN tempIds;
END;有一下问题:
1,这个写法有问题吗,测试语法没问题,但是执行结果总是为 空;
2,我用一个整数测试过,while 执行后,总是返回 45 + 记录条数,为空时返回 46;
3,这里的done变量自己会边吗,根据什么来改变?
谢谢解答!

解决方案 »

  1.   

    没有你的环境很难测试。先回答你第三个问题吧。
    3,这里的done变量自己会边吗,根据什么来改变?由于你在
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
    这儿声明这个事件,当SQLSTATE 02000发生的时, MySQL就会 SET done=1;20.2.10. 条件和处理程序
    http://dev.mysql.com/doc/refman/5.1/zh/stored-procedures.html#conditions-and-handlers这个语句指定每个可以处理一个或多个条件的处理程序。如果产生一个或多个条件,指定的语句被执行。 对一个CONTINUE处理程序,当前子程序的执行在执行处理程序语句之后继续。对于EXIT处理程序,当前BEGIN...END复合语句的执行被终止。UNDO 处理程序类型语句还不被支持。·         SQLWARNING是对所有以01开头的SQLSTATE代码的速记。·         NOT FOUND是对所有以02开头的SQLSTATE代码的速记。·         SQLEXCEPTION是对所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE代码的速记。除了SQLSTATE值,MySQL错误代码也不被支持。
      

  2.   

    你的程序中用到了第归,你看你的mysql有没有开启第归mysql> show variables like 'max_sp_recursion_depth';
    +------------------------+-------+
    | Variable_name          | Value |
    +------------------------+-------+
    | max_sp_recursion_depth | 0     |
    +------------------------+-------+
    1 row in set (0.00 sec)它决定你可以第归的层数
      

  3.   

    这个就是一个组合字符串功能的函数,是从mssql转换来的,我的函数本身没有语法问题;所以你可以模拟一个表执行看看;关于递规的问题,检查了,显示是0,但是我在测试时已经去掉了递规这行,执行结果还是不对:
    比如 调用:select neigetallpartentityid(1005,'a');
        返回:| a,1014,1015,1016,1026,1027,1028,1029,1023,1024,1025,1011,1012,1013,1020,1021,1022,1008,1017,1018,1019,1030,1031,1032,1033,1036,1037,1038,1039,1040,1041,1043,1044,1042,1045,1046,1091,1093,1095,1097,1099,1101,1103,1106,1108,1110,1112,1112真是奇怪!上面查询语句应该只有一条记录!,去掉递规,结果却是这样!
      

  4.   

    SELECT myEntityId FROM NeiEntityContainmentTable WHERE entityid = entityID;这句有问题,你的变量名和字段名重了 entityid = entityID 恒为TRUE,所以记录都会被选出, 。把变量名改掉应该就可以了。
      

  5.   

    确实是这个问题,疏忽了,非常感谢!
    还有一个问题,我把递归加上后,查返回的结果总是空,我set max_sp_recursion_depth = 10; 设置了
    难道mysql 不支持递归吗?
      

  6.   

    支持递归,层数有限制,变量名与字段名重复,优化考虑变量名,
    可以在UDF中加入拖入临时表的代码,以便测试,看看问题出在哪里
      

  7.   

    不报错,我写了一个最简单的 例子:
    create funciton thisFunc(i int)
    returns int
    begin
    SET max_sp_recursion_depth = 3;
            if(i = 1) then
            set i = 1;
            else
             set i =i * thisFunc(i - 1);
            end if;
            return i;
    end
    参数为1时,输出是1, 参数为2时,总是输出Query OK, -1 rows affected
    怎么回事?
      

  8.   

    原因很简单。procedure 可以递归,但 function 不可以。
      

  9.   

    你的UDF可以执行?应该是SP吧?
      

  10.   

    参考:http://www.blogjava.net/Skynet/archive/2008/10/01/232010.html
    递归SP