【问题标题】:Catch stored procedure output into a variable without using out params在不使用 out 参数的情况下将存储过程输出捕获到变量中
【发布时间】:2021-02-15 00:35:33
【问题描述】:

考虑以下过程:

CREATE PROCEDURE `getFoo`()
BEGIN
    select 'bar' as foo;
END;

一旦call-ed,它就会输出:

{"foo":"bar"}

但是如果getFoo 在一个不同的 存储过程中被调用,我该如何将它的结果内容捕获到一个变量中,像这样?

CREATE PROCEDURE `masterProc`()
BEGIN
    call `getFoo`() into @foo;
    select @foo as foo;
END;

调用时会输出以下错误:sqlMessage: "FUNCTION db.getFoo does not exist"

我知道涉及out 参数的可用选项,但对于我的问题,这些不是可行的解决方案。

义务

getFoo 无法更改。它将输出SELECT 语句的结果,而不涉及任何variablesparameters

我的尝试

不幸的是,都会输出错误。

set @foo = exec getFoo(); set @foo = call getFoo(); select getFoo() into @foo; call getFoo() into @foo;

【问题讨论】:

  • 我之前在mysql中没有遇到过currentFunction: - 你有它的参考吗?
  • @P.Salmon Snap 我忘了删除它。它用于GOTOleave 目的。编辑了问题并删除了语句标签
  • mysql中也没有goto..
  • 是的,GOTO 本身并没有声明,但有一些变通方法可以实现类似于 goto 的工作流程。

标签: mysql stored-procedures mysql-variables


【解决方案1】:

您无法从另一个过程捕获结果集(来自SELECT)。你有几个选择来做类似的事情:

  1. 将结果集放到临时表中。适用于多行。
  2. 使用 OUT 变量(最适合单个值)
  3. 使用用户定义的变量 (@var)(注意这些,因为调用其他过程可能会更改值)

创建 getFoo():

CREATE PROCEDURE getFoo()
BEGIN
drop temporary table if exists temptable;

create temporary table temptable 
as 
select col1, col2 FROM table1;

END;

创建masterProc():

CREATE PROCEDURE masterProc()
BEGIN
    call getFoo();

    select *
    from temptable;
END $$

调用masterProc():

call masterProc();

【讨论】:

  • 您能否附上一个工作示例,而getFoo 输出的是类似表格的结果而不是单个列值?非常感谢,谢谢
  • @Constantin 添加临时表的示例
【解决方案2】:

您可以在 mysql 中调用 SP 的唯一方法是使用 CALL 您得到的错误是因为您试图调用一个不存在的函数。用户定义的变量(at variables)在任何地方都可用

drop procedure if exists getfoo;
drop procedure if exists masterproc;
delimiter $$

CREATE PROCEDURE `getFoo`()
BEGIN
    set @foo = 'foo';
END $$

CREATE PROCEDURE `masterProc`()
BEGIN
    call `getFoo`();
    select @foo as foo;
END $$

delimiter ;

call masterproc();

+------+
| foo  |
+------+
| foo  |
+------+
1 row in set (0.001 sec)

【讨论】:

  • 您的解决方案没有将存储过程SELECT 输出捕获到主过程的变量中。相反,您的主过程选择了一个保留在嵌套过程中的变量。
  • @Constantin 将存储过程的 SELECT 输出捕获到主过程的变量中 不可能。
猜你喜欢
  • 2012-01-19
  • 2011-01-26
  • 2013-11-25
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多