我想写一个SQL函数,它通过SQL查询返回的记录列表(只有整数id),并使用这些参数执行另一个函数:
- 我不想枚举所有的id手工,即我想让他们首先由SQL查询返回,所以SET @recordlist = (SELECT ..),
- 我想有一个循环,为记录列表的每个元素执行另一个函数,即我希望能够在for语句中访问记录列表中的每个单个元素
它应该看起来像:
SET @recordlist = (SELECT ..)
For every element e in the recordlist
Execute function f(e)
使用带有循环游标的例程来实现这一点!
delimiter//
create procedure get_balance()
begin
DECLARE var1;
DECLARE flag INT DEFAULT 0;
.......
declare tcursor for select col1,col2.... from table;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag = 1;
open tcursor;
myloop:LOOP
fetch tcursor into col1,col2...;
if flag = 1 then
-- function here
call funtion;
leave myloop;
end if
end loop myloop;
close tcursor;
end//
delimiter;
我使用以下代码使其工作。复制&粘贴,更改查询和函数名。
DELIMITER $$
DROP PROCEDURE IF EXISTS `my`$$
CREATE PROCEDURE `my`()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE i INTEGER;
DECLARE curs1 CURSOR FOR SELECT DISTINCT `myval` FROM my_table;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN curs1;
read_loop: LOOP
FETCH curs1 INTO i;
IF done THEN
LEAVE read_loop;
END IF;
SELECT myfunc(i);
END LOOP;
CLOSE curs1;
END$$
DELIMITER ;