2011-09-20 40 views
5

Estoy tratando de obtener un parámetro de salida del procedimiento almacenado de MySQL, vamos a mirar un ejemplo a continuación:¿Cómo obtener los parámetros de salida del procedimiento almacenado de MySQL en Rails?

1 en MySQL creé este procedimiento y funciona.

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 Por lo tanto, también funciona en los carriles, pero no se devuelve ningún valor para mí:

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

Aquí es el registro en Rails

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

Mi pregunta es ¿cómo podría obtener el valor de retorno del parámetro de salida @id?

+0

¿Cuál es la razón real para utilizar procedimientos almacenados? ¿Hay requisitos específicos? Si es así, no olvides que es difícil mantener el control de versiones y el mantenimiento en todo el equipo de desarrollo – Anatoly

+0

¿Qué gema estás usando para mysql? – Fivell

+0

@Fivell Estoy usando mysql2 –

Respuesta

3

encontré una manera de obtener el parámetro de salida, para compartir con ustedes, ver más abajo:

1 para crear una conexión

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

2 usar esta conexión para llamar a su sp

client.query "call sp_xxx" 

3 para obtener el parámetro de salida

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

4 retorno de la salida

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

Dios, guíame para encontrar esta solución. – VvDPzZ

+0

gracias por la propina – Fivell

0

MySQL no funciona como SQL Server. Si desea un procedimiento de almacenamiento con un valor de retorno, realmente desea que sea una función (UDF). Necesita especificar el RETORNO como cualquier función de C++. Además, no necesita usar la llamada, porque es una función. Simplemente use la función SELECCIONAR()

Intente buscar información sobre UDF en el manual de MySQL. Hay mucha ayuda explícita para hacer eso.

Cuestiones relacionadas