问题描述
请考虑以下步骤:
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
语句的结果,而不会涉及任何variables
或parameters
。
我尝试过的事情
不幸的是,所有这些都将输出错误。
set @foo = exec getFoo();
set @foo = call getFoo();
select getFoo() into @foo;
call getFoo() into @foo;
解决方法
您无法从另一个过程中捕获结果集(来自SELECT
)。您有几种选择可以做类似的事情:
- 将结果集放入临时表中。适用于多行。
- 使用OUT变量(最适合单个值)
- 使用用户定义的变量(@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)