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变量自己会边吗,根据什么来改变?
谢谢解答!
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变量自己会边吗,根据什么来改变?
谢谢解答!
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错误代码也不被支持。
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| max_sp_recursion_depth | 0 |
+------------------------+-------+
1 row in set (0.00 sec)它决定你可以第归的层数
比如 调用: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真是奇怪!上面查询语句应该只有一条记录!,去掉递规,结果却是这样!
还有一个问题,我把递归加上后,查返回的结果总是空,我set max_sp_recursion_depth = 10; 设置了
难道mysql 不支持递归吗?
可以在UDF中加入拖入临时表的代码,以便测试,看看问题出在哪里
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
怎么回事?
递归SP