在不使用参数的情况下将存储过程的输出捕获到变量中

问题描述

请考虑以下步骤:

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;

解决方法

您无法从另一个过程中捕获结果集(来自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();
,

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

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)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...