在不使用 out 参数的情况下将存储过程输出捕获到变量中
Posted
技术标签:
【中文标题】在不使用 out 参数的情况下将存储过程输出捕获到变量中【英文标题】:Catch stored procedure output into a variable without using out params 【发布时间】: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
语句的结果,而不涉及任何variables
或parameters
。
我的尝试
不幸的是,都会输出错误。
set @foo = exec getFoo();
set @foo = call getFoo();
select getFoo() into @foo;
call getFoo() into @foo;
【问题讨论】:
我之前在mysql中没有遇到过currentFunction: - 你有它的参考吗? @P.Salmon Snap 我忘了删除它。它用于GOTO
和leave
目的。编辑了问题并删除了语句标签。
mysql中也没有goto..
dev.mysql.com/doc/refman/8.0/en/statement-labels.html
是的,GOTO
本身并没有声明,但有一些变通方法可以实现类似于 goto 的工作流程。
【参考方案1】:
您无法从另一个过程捕获结果集(来自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();
【讨论】:
您能否附上一个工作示例,而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 输出捕获到主过程的变量中 不可能。以上是关于在不使用 out 参数的情况下将存储过程输出捕获到变量中的主要内容,如果未能解决你的问题,请参考以下文章
在不创建存储过程的情况下将 PL/SQL 发送到 Oracle
如何在不将图像保存在本地的情况下将捕获的图像(Surface View)传递给另一个片段?
如何在不损失视网膜显示质量的情况下将 UIView 捕获到 UIImage
如何在不创建子外壳的情况下将命令的输出存储在变量中 [Bash <v4]