一尘不染

如何使用存储的MYSQL过程中的表输出

mysql

我一直在寻找最后一个小时左右,却没有找到这个看似简单的问题的最终答案:

如何调用存储的MYSQL函数/过程并将其输出用于进一步的SELECT查询?


尽管这显然行不通,但这是我想要的东西:

SELECT P.`id` FROM (CALL test_proc()) AS P

其中test_proc()由以下方式定义:

DROP PROCEDURE IF EXISTS test_proc;
DELIMITER ;;
CREATE PROCEDURE test_proc()
BEGIN
    SELECT * FROM `table`;
END;;
DELIMITER ;

举个例子。我也可以使用存储函数。


阅读 295

收藏
2020-05-17

共1个答案

一尘不染

无法直接完成此操作,因为存储过程中无限制选择的输出是发送给客户端的结果集,但从技术上讲不是表。

解决方法是让proc在为您创建表后将数据放入临时表中。该过程完成后,此表仅对您的连接可用。如果其他人同时运行proc,并且不会对其他任何连接可见,则不会引起冲突。

将此添加到过程中:

DROP TEMPORARY TABLE IF EXISTS foo;
CREATE TEMPORARY TABLE foo SELECT ... your existing select query here ...;

过程完成后,SELECT * FROM foo;将为您提供从proc中获得的收益。您几乎可以像任何桌子一样加入它。

完成后,放下它,否则当断开连接时它会自行消失。如果再次运行该proc,它将被删除并重新创建。

2020-05-17