-1

考虑以下过程:

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语句的结果,而不涉及任何variablesnor parameters

我试过的

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

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

4

2 回答 2

0

您无法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();
于 2020-11-02T11:38:47.000 回答
-1

您可以在 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)
于 2020-11-02T11:11:55.093 回答