2012-06-29 41 views
1

如果我使用OUT或INOUT參數在MySQL中創建存儲過程,則不起作用。即使我將存儲過程留空。該DDL如下:OUT或INOUT參數不起作用

CREATE DEFINER=`root`@`localhost` PROCEDURE `testing_inout`(`a` int,INOUT `b` int) 
BEGIN 

END 

第一個參數是一個常規參數。第二個是一個INOUT paremeter(即使設置爲OUT了同樣的問題依然存在)

當我調用這個存儲過程,我得到一個錯誤,指出:

OUT或INOUT參數2例行DB_NAME。在BEFORE觸發器中,testing_inout不是 變量或NEW僞變量。

即使在存儲過程中寫入代碼,此錯誤仍然存​​在。我正在運行MySQL版本5.1.41。

這對我來說是一個很大的問題,因爲我無法輸出遞歸存儲過程的結果,因爲這個錯誤。

+0

您應該可以顯示調用該過程的語句。 –

+0

我不認爲問題在於SP,而是在調用SP的時候觸發'BEFORE'觸發器。 –

+0

我同意問題必須與調用SP的BEFORE觸發器一起使用。當我通過Navicat運行SP時發生此錯誤。但是當我從另一個SP調用SP時,我沒有看到錯誤。結論:Navicat的運行按鈕調用SP的方式與OUT和INOUT參數不兼容。 – prince

回答

4

它爲我工作

mysql> CREATE DEFINER=`root`@`localhost` PROCEDURE `testing_inout`(`a` int,INOUT `b` int) 
    -> BEGIN 
    -> 
    -> END 
    -> ; 
Query OK, 0 rows affected (0.00 sec) 

第二個參數,因爲它是INOUT它必須是一個變量:

mysql> set @c:=1; 
Query OK, 0 rows affected (0.00 sec) 

mysql> call testing_inout(1,@c); 
Query OK, 0 rows affected (0.00 sec) 

如果你嘗試這樣它會返回1:

delimiter | 
CREATE DEFINER=`root`@`localhost` PROCEDURE `testing_inout`(`a` int,INOUT `b` int) 
BEGIN 
select b; 
END 
| 
delimiter ; 

mysql> call testing_inout(1,@c); 
+------+ 
| b | 
+------+ 
| 1 | 
+------+ 
1 row in set (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 
+0

對另一個mysql bug的+1(我測試過) –

+1

OP說:*'當我**調用這個存儲過程時,我得到一個錯誤'*。這個問題可能與定義完全不同。 –

+0

@AndriyM謝謝我修復 – jcho360