您的代码存在的问题是,
WHERE parent_id IN(x);
当x替换为其值时实际上变为:
WHERE parent_id IN(',2323,2324,2335,2336,2337,4869,5121,6033,6783,1061');
请注意那里的单引号。你认为你传递了一系列数字,但事实上你传递了一个单独的文本字符串。另请注意,您的代码前面有这个逗号。因此即使它不会传递一个单独的文本字符串,它也会因语法错误而失败。你需要做的是使用动态sql。这仅适用于存储过程,而不是函数。
我已经为你重写了代码:
DELIMITER $$
DROP PROCEDURE IF EXISTS getBaseID $$
CREATE PROCEDURE getBaseID(IN articleID varchar(1024), OUT rtext TEXT)
BEGIN
SET rtext = "-1";
SET @x = articleID;
sloop:LOOP
SET @y = NULL;
SET @sql = CONCAT('SELECT GROUP_CONCAT(id) INTO @y FROM pctable WHERE parent_id IN(', @x, ');');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
IF @y IS NULL THEN
LEAVE sloop;
END IF;
SET @x = @y;
SET rtext = CONCAT(rtext, ',', @x);
ITERATE sloop;
END LOOP;
END $$
DELIMITER ;
我添加了
SET rtext = "-1";
使用前导逗号来解决问题,假设您的表中没有否定id。
您可以使用执行它
CALL getBaseID(2322, @my_result); /*This executes the function and writes the result into the variable you pass as second parameter.*/
SELECT @my_result; /*Then you select the result.*/
最后一点,即使它适用于您的功能,在这种情况下您也不需要选择表格。你可以用SELECT getBaseID(2322);简单地执行它。这个函数中的任何内容都不是指行或什么的。