我正在使用MySQL,我想使用一个"with“语句来读取查询中另一个存储过程的输出,但是当我试图在"with”语句中使用"CALL sp_2()“时,它会抛出一个异常。
这个很好用:
CALL sp_2(user_input);但这个不是:
WITH A AS (CALL sp_2(user_input))
SELECT * FROM A;我是不是做错了什么,或者MySQL真的不允许"WITH“语句使用其他存储过程?还有别的解决办法吗?
发布于 2022-05-02 16:13:26
MySQL存储过程返回结果集。实际上,它们返回多个结果集。也就是说,您可以在一个过程中运行多个SELECT查询。每个结果集返回一个单独的结果集。因此,调用过程的客户端必须遍历结果集。
https://dev.mysql.com/doc/refman/8.0/en/call.html说:
若要编写使用CALL SQL语句执行生成结果集的存储过程的C程序,必须启用
标志。这是因为,除了在过程中执行的语句可能返回的任何结果集之外,每个调用都返回一个结果以指示调用状态。
下面是一个返回两个结果集的过程的示例。我在MySQL命令行客户机中运行这个命令行,它会自动处理多个结果集。
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查询,可以在客户端应用程序中编写代码,将数据插入临时表。或者您可以编写过程本身,将其结果保存到临时表中,而不是将它们作为结果集返回。
https://stackoverflow.com/questions/72085871
复制相似问题