2013-07-30 9 views
15

ho cercato per l'ultima ora o giù di lì e non ho trovato una risposta definitiva a questo problema apparentemente semplice:Come usare uscita Tabella dalla procedura MYSQL immagazzinata

Come si chiama una funzione memorizzata MYSQL/procedura e utilizzare il suo output in ulteriori query SELECT?


Anche se questo, ovviamente, non funziona, questo è il tipo di cosa che mi piacerebbe avere:

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

Dove test_proc() è definita da:

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

Proprio come un esempio. Starei bene anche usando una funzione memorizzata.

risposta

17

Questo non può essere fatto, direttamente, perché l'output di una selezione illimitata in una stored procedure è un set di risultati inviato al client, ma non tecnicamente una tabella.

La soluzione è lasciare che il proc inserisca i dati in una tabella temporanea dopo aver creato la tabella per te. Questa tabella sarà disponibile solo per la tua connessione al termine della procedura. Non causerà un conflitto se qualcun altro esegue il proc allo stesso tempo e non sarà visibile a nessun'altra connessione.

Aggiungere questo alla procedura:

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

Quando la procedura termina, SELECT * FROM foo; vi darà quello che quello che si sarebbe ottenuto dal proc. Puoi unirti ad esso praticamente come qualsiasi tavolo.

Al termine, rilasciarlo, o andrà via da solo quando si disconnette. Se si esegue nuovamente il proc, verrà eliminato e ricreato.

+0

Cheers, questo è esattamente quello che stavo cercando :) – Johannes

+0

Come posso chiamare test_proc() durante la creazione di tabella temporanea. Voglio mantenere la logica in SP separata e non voglio mescolare le istruzioni select con la tabella temporanea –

+0

@HimalayaGarg, per favore spiega cosa intendi * "durante la creazione" * - intendi qualcosa come 'CREA TABELLA TEMPORANEA t1 UTILIZZANDO RISULTATO DA CHIAMATA test_proc() '? Scusa, l'ho appena inventato. Non c'è una tale sintassi. Per favore, spiega cosa stai cercando di fare. –

Problemi correlati