首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在"with“语句中调用存储过程

问在"with“语句中调用存储过程
EN

Stack Overflow用户
提问于 2022-05-02 11:13:46
回答 1查看 222关注 0票数 1

我正在使用MySQL,我想使用一个"with“语句来读取查询中另一个存储过程的输出,但是当我试图在"with”语句中使用"CALL sp_2()“时,它会抛出一个异常。

这个很好用:

代码语言:javascript
复制
CALL sp_2(user_input);

但这个不是:

代码语言:javascript
复制
WITH A AS (CALL sp_2(user_input))
SELECT * FROM A;

我是不是做错了什么,或者MySQL真的不允许"WITH“语句使用其他存储过程?还有别的解决办法吗?

EN

回答 1

Stack Overflow用户

发布于 2022-05-02 16:13:26

MySQL存储过程返回结果集。实际上,它们返回多个结果集。也就是说,您可以在一个过程中运行多个SELECT查询。每个结果集返回一个单独的结果集。因此,调用过程的客户端必须遍历结果集。

https://dev.mysql.com/doc/refman/8.0/en/call.html说:

若要编写使用CALL SQL语句执行生成结果集的存储过程的C程序,必须启用

标志。这是因为,除了在过程中执行的语句可能返回的任何结果集之外,每个调用都返回一个结果以指示调用状态。

下面是一个返回两个结果集的过程的示例。我在MySQL命令行客户机中运行这个命令行,它会自动处理多个结果集。

代码语言:javascript
复制
mysql> delimiter //

mysql> create procedure p()
    -> begin
    -> select 123 as foo;
    -> select 'abc' as c1, 'xyz' as c2;
    -> end//
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;

mysql> call p;
+-----+
| foo |
+-----+
| 123 |
+-----+
1 row in set (0.01 sec)

+-----+-----+
| c1  | c2  |
+-----+-----+
| abc | xyz |
+-----+-----+
1 row in set (0.01 sec)

Query OK, 0 rows affected (0.01 sec)

那么,如何从CTE或子查询中调用这一点呢?答:它不能。每个CTE或子查询只能运行一个返回单个结果集的SELECT语句。

调用过程的唯一方法是使用来自客户端的call语句或来自另一个存储例程(过程、函数、触发器或事件)。

那么,如何保存存储过程的结果呢?

通常,将结果集获取到客户端应用程序,并对代码中的数据做任何您想做的事情。

如果需要对结果数据执行进一步的SQL查询,可以在客户端应用程序中编写代码,将数据插入临时表。或者您可以编写过程本身,将其结果保存到临时表中,而不是将它们作为结果集返回。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72085871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档