我一直在寻找最后一个小时左右,却没有找到这个看似简单的问题的最终答案:
如何调用存储的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 ;
举个例子。我也可以使用存储函数。
无法直接完成此操作,因为存储过程中无限制选择的输出是发送给客户端的结果集,但从技术上讲不是表。
解决方法是让proc在为您创建表后将数据放入临时表中。该过程完成后,此表仅对您的连接可用。如果其他人同时运行proc,并且不会对其他任何连接可见,则不会引起冲突。
将此添加到过程中:
DROP TEMPORARY TABLE IF EXISTS foo; CREATE TEMPORARY TABLE foo SELECT ... your existing select query here ...;
过程完成后,SELECT * FROM foo;将为您提供从proc中获得的收益。您几乎可以像任何桌子一样加入它。
SELECT * FROM foo;
完成后,放下它,否则当断开连接时它会自行消失。如果再次运行该proc,它将被删除并重新创建。