2009-03-09 14 views
9

Ho una procedura memorizzata MySQL con alcuni cursori. Voglio stampare un valore per inviare l'output al client. SQLyog Enterprise.Come simulare una stampa in una stored procedure MySQL

Ho provato a dichiarare una variabile come TEXT e concatenando all'interno del ciclo ma ciò non funziona, almeno non nel modo in cui stavo cercando di farlo.

DECLARE _output TEXT; 
DECLARE _ID INT DEFAULT 0; 
DECLARE cur1 CURSOR FOR SELECT ID FROM CodeID; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

OPEN cur1; 

REPEAT 
    FETCH cur1 INTO _ID; 
    IF NOT done THEN 
    SET _output = _ID; /*SEE ALT BELOW*/ 

    END IF; 
UNTIL done END REPEAT; 
CLOSE cur1; 

SELECT _output; 

ho provato:

SET _output = _output + _ID 

e

SET _output = CONCAT(_output,_ID) 

ma entrambi solo restituiscono NULL

SET _output = _ID; appena mi dà l'ultima riga caricata. Che è utile ma non del tutto quello che volevo.

Qual è il modo migliore per visualizzare ogni riga recuperata sullo schermo per riprodurre la stampa MySQL in una stored procedure MySQL?

risposta

14

Lo stai facendo correttamente con il tuo SELECT _output; Tutto ciò che viene selezionato senza una clausola INTO verrà restituito al client.

Per ottenerli tutti, è possibile spostare SELECT nel ciclo (per stamparli singolarmente) oppure è possibile concatenarli insieme. Il problema con il tuo concat che restituiva NULL era perché non hai inizializzato l'_output su qualcosa, quindi era NULL. Concatiando nulla con NULL restituirà NULL.

provare quanto segue:

DECLARE _output TEXT DEFAULT ''; 
DECLARE _ID INT DEFAULT 0; 
DECLARE cur1 CURSOR FOR SELECT ID FROM CodeID; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 

OPEN cur1; 

REPEAT 
    FETCH cur1 INTO _ID; 
    IF NOT done THEN 
    SET _output = CONCAT(",", _ID); /*SEE ALT BELOW*/ 

    END IF; 
UNTIL done END REPEAT; 
CLOSE cur1; 

SELECT _output; 
+6

Non dovrebbe essere 'SET _output = CONCAT (_output, "", _ID);' Altrimenti avrà solo l'ultimo ID – Marcus

Problemi correlati