通过Rails用OUT参数调用MySQL存储过程

时间:2015-06-03 10:20:45

标签: mysql ruby-on-rails plsql

存储过程类似于:

CREATE PROCEDURE `manager`(IN amount decimal(9,2), IN list text, IN acc_id int(11), OUT return_code int(1))
BEGIN

 DECLARE exit handler for sqlexception, sqlwarning
  BEGIN
  set return_code = 1;
  rollback;
  END;
  SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
  --my code
  set return_code = 0;
END

rails模型的方法是:

return_code = -1
return_code = self.connection.execute("call manager(#{amount}, '#{list}', #{acc_id}, #{return_code})")

但这会引发错误:

ActiveRecord::StatementInvalid: Mysql2::Error: OUT or INOUT argument 4 for routine staging.manager is not a variable or NEW pseudo-variable in BEFORE trigger: call manager(2222, 'list', 2, -1)

在从rails调用存储过程时如何传递OUT参数需要一些帮助。

1 个答案:

答案 0 :(得分:0)

以下解决方案对我有用:

我刚用 @return_code 更改了#{return_code>(不需要传递return_code = -1作为输入,因为它是一个OUT参数):

return_code = self.connection.execute("call manager(#{amount}, '#{list}', #{acc_id}, @return_code)")

在存储过程中,我用@return_code替换了return_code,最后添加了一个select语句:

CREATE PROCEDURE `manager`(IN amount decimal(9,2), IN list text, IN acc_id int(11), OUT return_code int(1))
BEGIN

 DECLARE exit handler for sqlexception, sqlwarning
 BEGIN
  set return_code = 1;
  rollback;
 END;
 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
   --my code
 set return_code = 0;
 SELECT @return_code;
END