mysql - 使用mysql递归调用的存储过程

标签 mysql stored-procedures recursion

enter image description here enter image description here get legside from binary

我尝试过使用递归调用的存储过程。我需要根据 leg1 显示基于 emp_name 的相关名称

但它显示错误,如#1414 - 例程 sample.getVolume 的 OUT 或 INOUT 参数 2 不是变量或 BEFORE 触发器中的新伪变量

这是我的代码,

DELIMITER $$
CREATE PROCEDURE getVolume( IN param_name VARCHAR(255), OUT result VARCHAR(255 ))
BEGIN 
SELECT val INTO result FROM employee WHERE emp_name = param_name ;
IF result IS NULL THEN
select result;
ELSE     
CALL getVolume(result, '');
END IF;
END $$
DELIMITER ;



SET @@GLOBAL.max_sp_recursion_depth = 255;
SET @@session.max_sp_recursion_depth = 255; 
call getVolume('new', @result);
select @result;

最佳答案

@Shadow 的回答是正确的。这是一个可以帮助您的实际示例:

DELIMITER //

DROP TABLE IF EXISTS `employee`//
DROP PROCEDURE IF EXISTS `getVolume`//

CREATE TABLE `employee` (
  `emp_name` VARCHAR(255),
  `val` VARCHAR(255)
)//

INSERT INTO `employee` (`emp_name`, `val`)
VALUES
('demo', 'new'),
('new', 'd.new'),
('d.new', 'view'),
('view', 'hello'),
('hello', NULL)
//

CREATE PROCEDURE `getVolume`(
  IN `param_name` VARCHAR(255),
  OUT `result` VARCHAR(255)
)
BEGIN
  DECLARE `next_param_name` VARCHAR(255);
  SELECT `val` INTO `next_param_name`
  FROM `employee`
  WHERE `emp_name` = `param_name`;

  IF `next_param_name` IS NULL THEN
    SET `result` := `param_name`;
  ELSE
    -- CALL `getVolume`(`result`, '');
    CALL `getVolume`(`next_param_name`, `result`);
    -- SET `result` := CONCAT(`param_name`, ',', IFNULL(`result`, ''));
  END IF;
END//

DELIMITER ;

SQL Fiddle demo

关于mysql - 使用mysql递归调用的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33750165/

相关文章:

mysql - LONGTEXT 在 PGSQL 和 MySQL 的迁移中有效

php - 如何使用值(例如: insert to mysql) from slide range after press ok button?

mysql - xampp Windows HTTP 错误 404.0

python - 如何使用 python 避免嵌套函数中的深度递归

math - 设置和解决递归函数的递归关系?

mysql - 获取最大日期的计数 [MYSQL]

MySQL函数参数检查是否为NULL

python - 如何从 python 在 mysql 中创建存储过程?

mysql - 临时表不存在错误

javascript - 删除数组中相邻的重复项