2013-07-30 1 views
15

Я искал в течение последнего часа или так и не нашел убедительного ответа на этот, казалось бы, простой задачи:Как использовать таблицу вывода из хранимой процедуры MYSQL

Как вы вызываете хранимую функцию MYSQL/procedure и использовать его вывод в последующих запросах 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 в одно и то же время и не будет видимым для какого-либо другого соединения.

Добавьте это к процедуре:

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

Когда процедура заканчивается, SELECT * FROM foo; даст вам то, что вы, что вы получили бы от прока. Вы можете присоединиться к нему почти так же, как и любой стол.

Когда вы закончите, отбросьте его, или он исчезнет сам по себе, когда вы отключитесь. Если вы снова запустите proc, он будет сброшен и воссоздан.

+0

Привет, это именно то, что я искал :) – Johannes

+0

Как я могу вызвать test_proc() при создании временной таблицы. Я хочу, чтобы логика в SP была отдельной и не хотела смешивать операторы выбора с временной таблицей –

+0

@HimalayaGarg, пожалуйста, объясните, что вы имеете в виду * «при создании» * - вы имеете в виду что-то вроде 'CREATE TEMPORARY TABLE t1 ИСПОЛЬЗОВАНИЕ РЕЗУЛЬТАТОВ ОТ CALL test_proc() '? Извините, я только что сделал это. Такого синтаксиса нет. Пожалуйста, объясните, что вы пытаетесь сделать. –

 Смежные вопросы

  • Нет связанных вопросов^_^