2011-09-20 21 views
5

Sto cercando di ottenere un parametro di output dalla stored procedure MySQL, diamo un'occhiata al seguente esempio:Come ottenere i parametri di output dalla stored procedure MySQL in Rails?

1 In mysql ho creato questa procedura e funziona.

CREATE PROCEDURE sp_name (out id int) 
Begin 
    select id into @id from table order by id desc limit 1; 
End 

mysql> call sp_deduct_credit_and_money(@id); 
Query OK, 0 rows affected (0.01 sec) 

mysql> select @id; 
+--------------+ 
|   @id | 
+--------------+ 
|   24 | 
+--------------+ 
1 row in set (0.00 sec) 

2 Pertanto, funziona anche in Rails, ma non restituisce alcun valore per me:

ActiveRecord::Base.connection.execute("call sp_name(@id)") 
ActiveRecord::Base.connection.execute("select @id") 

Ecco il log in Rails

(2.0ms) call sp_name(@id) 
(0.1ms) select @id 

La mia domanda è in che modo è possibile ottenere il valore di ritorno del parametro di uscita @id?

+0

cosa è vera ragione per usare stored procedure? Esistono requisiti ecologici? Se è così, non dimenticare che è difficile mantenere il controllo delle versioni e fare manutenzione attraverso il team di sviluppo – Anatoly

+0

che gemma stai usando per mysql? – Fivell

+0

@Fivell Sto usando mysql2 –

risposta

3

Ho trovato un modo per ottenere il parametro di uscita, per condividere con voi ragazzi, vedere sotto:

1 per creare una connessione

client = Mysql2::Client.new(ActiveRecord::Base.configurations[Rails.env.to_s].symbolize_keys) 

2 Utilizzare questo collegamento per chiamare la sp

client.query "call sp_xxx" 

3 per ottenere il parametro di uscita

result = client.query("select @output_parameter") 

4 ritorno l'uscita

return !result.first["@output_parameter"].nil? 
+0

Dio mi guida per trovare questa soluzione. – VvDPzZ

+0

grazie per il suggerimento – Fivell

0

MySQL non funziona come SQL Server. Se si desidera una procedura di archiviazione con un valore di ritorno, si desidera realmente che sia una funzione (UDF). È necessario specificare il RETURN come qualsiasi funzione C++. Inoltre non è necessario utilizzare la chiamata, perché è una funzione. Basta usare la funzione SELECT()

Prova a cercare informazioni su UDF nel manuale MySQL. C'è un aiuto molto esplicito per farlo.

Problemi correlati