在不使用 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 语句的结果,而不涉及任何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.. 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]

在不使用经典 RPyC 的情况下将 RPyC 的标准输出重定向到本地客户端

如何在不使用任何付费工具的情况下将 dbf 文件导入 mysql?