我有这个作为一个示例函数。这意味着在游标上做一些更多的处理,但现在我让它计算结果的总数(我不想使用count,因为我计划稍后扩展它)。
delimiter $$
create function testfunction()
returns int reads sql data
begin
declare l_myfield int;
declare iter int;
declare mycur cursor for select myfield from mytable;
set iter = 0;
open mycur;
loop
fetch mycur into l_myfield;
set iter = iter + 1;
end loop;
close mycur;
return iter;
end;
$$
delimiter ;
然而,我最终还是选择了经典的:
ERROR 1329 (02000): No data - zero rows fetched, selected, or processed
注意,我确实有从查询返回的数据,并且我知道如何使用if-not-found处理程序。为了简洁,我省略了这些。
我哪里做错了?欢呼声
您需要添加一个处理程序:
delimiter $$
CREATE function testfunction()
returns int reads sql data
BEGIN
DECLARE done INT DEFAULT FALSE;
declare i_myfield int;
declare iter int;
declare mycur cursor for select myfield from mytable;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
set iter = 0;
open mycur;
read_loop: loop
fetch mycur into i_myfield;
IF done THEN
LEAVE read_loop;
END IF;
SET iter = iter + 1;
END loop;
close mycur;
return iter;
END;
$$
delimiter ;
通过声明处理程序并在循环中使用它,可以在到达结果集末尾时捕获NOT FOUND错误。或者如果查询没有返回结果。