2013-07-30 11 views
15

Szukałem na ostatnią godzinę i nie znalazłem jednoznacznej odpowiedzi na to pozornie prostego problemu:Jak korzystać z tabeli przechowywane wyjście MYSQL postępowania

Jak zadzwonić przechowywanej funkcji MySQL/procedure i użyć jej wyników w kolejnych zapytaniach SELECT?


Chociaż to oczywiście nie działa, jest to rodzaj rzeczy chciałbym mieć:

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

Gdzie test_proc() jest zdefiniowana przez:

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

Jako przykład. Byłbym też w porządku przy użyciu funkcji przechowywanej.

Odpowiedz

17

Nie można tego zrobić bezpośrednio, ponieważ wyjście nieskrępowanego wyboru w procedurze przechowywanej jest zestawem wynikowym wysłanym do klienta, ale nie jest technicznie tabelą.

Obejście problemu polega na zezwoleniu procesowi na umieszczenie danych w tabeli tymczasowej po utworzeniu dla ciebie tabeli. Ta tabela będzie dostępna tylko dla twojego połączenia po zakończeniu procedury. Nie spowoduje konfliktu, jeśli ktoś inny uruchomi proces w tym samym czasie i nie będzie widoczny dla żadnego innego połączenia.

Dodaj tę procedurę:

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

Gdy procedura się zakończy, SELECT * FROM foo; da ci to, czego co byś dostał od proc. Możesz dołączyć do niego prawie jak każdy stół.

Gdy skończysz, upuść go, lub odejdzie sam, gdy się rozłączysz. Jeśli ponownie uruchomisz proces, zostanie on usunięty i ponownie utworzony.

+0

Pozdrawiam, dokładnie tego szukałem :) – Johannes

+0

Jak wywołać test_proc() podczas tworzenia tabeli tymczasowej. Chcę zachować logikę w SP osobno i nie chcę mieszać instrukcji select z tabelą tymczasową –

+0

@HimalayaGarg proszę wyjaśnić, co masz na myśli * "podczas tworzenia" * - masz na myśli coś w stylu 'STWÓRZ TERMINOWĄ tabelę t1 ZA POMOCĄ WYNIKU Z POŁĄCZENIA test_proc() '? Przepraszam, właśnie to wymyśliłem. Nie ma takiej składni. Proszę wyjaśnij, co próbujesz zrobić. –