2015-06-03 26 views
2

存儲過程OUT參數調用MySQL的存儲過程看起來類似:通過Rails的

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 

從軌道模型的方法是:

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

檢查:[http://stackoverflow.com/q/ 7480579/1316440](http://stackoverflow.com/q/7480579/1316440) – wchiquito

+0

謝謝。這工作。根據我的代碼,我修改了一下。我已經發布了下面的答案。 – codevj

回答

0

下面的解決方案爲我:

我只是@return_code(不需要傳遞值return_code = -1作爲輸入改變了#{值return_code),因爲它是一個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