如何传递逗号分隔的输入参数以从另一个存储过程调用存储过程

Posted

技术标签:

【中文标题】如何传递逗号分隔的输入参数以从另一个存储过程调用存储过程【英文标题】:How to pass comma separated input parameter to call stored procedure from another stored procedure 【发布时间】:2020-01-13 08:45:11 【问题描述】:

我推荐this link 传递逗号分隔的字符串来运行查询。效果很好! 但是我用同样的方法调用存储过程,出现如下错误:

错误代码:1318。PROCEDURE UPDATE_DETAILS 的参数数量不正确;预期 1,得到 3

这是我使用上面链接中提到的方法尝试过的示例,

CREATE DEFINER=`root`@`localhost` PROCEDURE `RUN_JOB`()
BEGIN
   declare ids text;

    select group_concat(id) into ids from table_1;

    set @sql = concat('call 
    UPDATE_DETAILS(',ids, ')');

    PREPARE stmt FROM @sql;

    EXECUTE stmt;

    DEALLOCATE PREPARE stmt;

END



CREATE DEFINER=`root`@`localhost` PROCEDURE `UPDATE_DETAILS`(
IN id_value int)
BEGIN

    update table_2 set 
        col_1 = 'some_value' where id = id_value;

    update table_3 set 
        col_2 = 'some_value' where id = id_value;

END

这是正确的方法还是有其他方法可以实现?

提前致谢!

【问题讨论】:

“这是正确的方法吗?或者还有其他方法可以实现吗?” 看起来您正在尝试在 mysql 中实现动态运行时? ...使用common_schema(由@shlomi-noach创建)和QueryScript可能更有意义.. 感谢@HeroGoes 的建议。我会尝试使用 common_scheme 和 QueryScript 逗号分隔的字符串是 varchar 但您已将 UPDATE_DETAILS 的输入参数作为 int 传递。因此出现错误。 【参考方案1】:

由于您将逗号分隔值解析为 int 变量,因此它不起作用。

试试下面的 sp。这里用cursor一一取id,会调用spUPDATE_DETAILS

CREATE DEFINER=`root`@`localhost` PROCEDURE `RUN_JOB`()
BEGIN

    declare v_id int;
    declare done boolean default false;

    declare cur_id cursor for select id from table_1;

    declare continue handler for not found set done=true;

    open cur_id;

    call_loop: loop

        fetch cur_id into v_id;

            if done then

                leave call_loop;

            end if;

        call UPDATE_DETAILS(v_id);

    end loop;

    close cur_id;

    set done=false;

END

【讨论】:

感谢@James 提供此解决方案。现在它工作正常! 标记为答案,以便对其他人有用。投票按钮下方的勾号。

以上是关于如何传递逗号分隔的输入参数以从另一个存储过程调用存储过程的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有临时表的情况下从另一个存储过程调用存储过程(带参数)

c#中两种不同的存储过程调用与比较

java字符串数组作为参数传递oracle存储过程

sqlserver 存储过程 使用事务,说明在下边,求大神指教!

将分隔字符串拆分为存储过程中的变量[重复]

如何调用 shell 脚本并从另一个 shell 脚本传递参数