【问题标题】:Stored procedure with recursive call using mysql使用mysql进行递归调用的存储过程
【发布时间】:2016-02-18 10:10:49
【问题描述】:

enter image description hereget legside from binary

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

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

这是我的代码,

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;

【问题讨论】:

    标签: mysql stored-procedures recursion


    【解决方案1】:

    @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

    【讨论】:

    • 感谢 wchiquito。它以最低记录工作。但如果我在最大记录数中使用此 SP(我有 4200 条记录)。它将错误显示为“#1456 - 例程 getFinal 超出了递归限制 255(由 max_sp_recursion_depth 变量设置)”。请参阅我更新的问题和解决问题的指南。
    • @nagoormeeran:变量max_sp_recursion_depth的最大值为:255。见5.1.4 Server System Variables (max_sp_recursion_depth)
    【解决方案2】:

    问题是当你在getresult中调用getResult()时,你传递了一个空字符串constant作为参数:

    CALL getVolume(result, '');
    

    改为声明一个变量并将其作为参数传递。在 getVolume 调用之后,不要忘记使用分隔符将 getVolume 返回的内容连接到结果变量。您确定 255 个字符足以容纳所有值吗?

    【讨论】:

      猜你喜欢
      • 2011-03-27
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 2015-08-08
      相关资源
      最近更新 更多