2012-06-12 2 views

risposta

45
CREATE PROCEDURE innerproc(OUT param1 INT) 
BEGIN 
insert into sometable; 
SELECT LAST_INSERT_ID() into param1 ; 
END 
----------------------------------- 
CREATE PROCEDURE outerproc() 
BEGIN 
CALL innerproc(@a); 
// @a gives you the result of innerproc 
SELECT @a INTO variableinouterproc FROM dual; 
END 

OUT parametri dovrebbero aiutarvi a ottenere i valori di nuovo alla chiamata procedure.Based sul fatto che la soluzione deve essere qualcosa di simile.

+0

Stai usando, pensi che sia meglio fare LAST_INSERT_ID()? –

+0

Se fosse una funzione, restituiresti LAST_INSERT_ID dalla funzione come VALORE DI RITORNO. Questa soluzione deve fornire lo stesso in modo che PROCEDURE sia equivalente alla funzione –

+0

L'altra risposta dice che posso usare LAST_INSERT_ID() senza OUT? –

6

Per chiamare un altro procedimento, utilizzare CALL: es: Call SP1(parm1, parm2);

Per ottenere l'identità, non si tenta di verificare LAST_INSERT_ID(); Dovresti fare qualcosa come SELECT LAST_INSERT_ID() dopo la tua chiamata SP.

Ecco un completo, ad esempio testato:

DELIMITER $$ 

CREATE TABLE animals (
    id MEDIUMINT NOT NULL AUTO_INCREMENT, 
    name CHAR(30) NOT NULL, 
    PRIMARY KEY (id) 
) $$ 

CREATE PROCEDURE sp1() 
BEGIN 
    insert into animals (name) values ('bear'); 
END $$ 

CREATE PROCEDURE sp2() 
BEGIN 
    call sp1; 
    select last_insert_id(); 
END $$ 

call sp2; 
+0

Stai utilizzando LAST_INSERT_ID(), pensi che sia meglio farlo? –

+0

@Mike Il parametro Flynn- OUT non è realmente necessario, è possibile ottenere l'ultimo ID inserito semplicemente chiamando select last_insert_id(). – dcp

+0

e se si desidera restituire l'ULTIMO INSERIMENTO ID o recuperarlo se disponibile nella stessa funzione? –