2013-07-30 114 views
15

我一直在寻找的最后一个小时左右,并没有发现确凿的答案,这个看似简单的问题表输出:如何使用从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 ; 

只是一个例子。我也可以使用存储函数。

回答

17

这不能直接完成,因为存储过程中无界选择的输出是发送给客户端的结果集,但技术上不是表。

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

此添加到程序:

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

当你的程序完成后,SELECT * FROM foo;会给你你你会从PROC得到。你可以像任何表一样加入它。

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

+0

干杯,这就是我一直在寻找:) – Johannes

+0

如何在创建临时表时调用test_proc()。我想保持SP中的逻辑单独,不想混合选择语句与临时表 –

+0

@HimalayaGarg请解释你的意思*“创建时”* - 你的意思是像'CREATE TEMPORARY TABLE t1使用调用结果FROM CALL test_proc()'?对不起,我刚刚做完了。没有这样的语法。请解释你正在尝试做什么。 –