2013-03-26 69 views
4

MySQL存儲過程中的OUT的目的是什麼?在MySQL存儲過程中OUT的用途是什麼?

如果我有一個簡單的存儲過程,看起來像這樣:

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `new_routine`(
    IN iID int 
) 
BEGIN 
    select * from table1 where id = iID; 
END 

這會給我所有我想要的結果通過運行:

call new_routine(7); 

那麼,爲什麼我想/需要使用OUT

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `new_routine`(
    IN iID int, 
    OUT vName varchar(100) 
) 
BEGIN 
    select name into vName from table1 where id = iID; 
END 

,並調用它

call new_routine(7, @name); 
select @name; 

哪位能給我只是名稱,而不是一切從返回的行?

我試過谷歌搜索,但顯然沒有要求谷歌正確的問題得到明確的答案。

回答

5

是的,你說的沒錯,第二次打電話你現在只能得到自己的名字。

對很多人而言,超出參數通常被認爲是不好的做法,但是如果您希望在調用之後可以使用一個值(也可以通過函數明顯計算),它們可能非常方便。在大多數情況下,有一種更好的方法可以實現你想要的而不使用out參數。

但是,如果你願意,唯一的「優勢」是你在變量中有一個值而不是結果集,如果你決定在SQL中進一步使用那個值,或者你想工作,用它。

因此,在大多數情況下,您應該不使用out參數,而是使用函數。 如果你有程序返回結果集AND out-parameters試圖將它們分解成更小的函數/過程以避免出錯參數,因爲它只是不好閱讀和維護;)

2

有些文檔:http://dev.mysql.com/doc/refman/5.0/en/call.html也許它會幫助,報價:

要使用OUT或INOUT參數返回從過程的值, 用戶變量的方式傳遞參數,然後檢查過程返回後變量的值爲 。 (如果要從另一個存儲過程或函數中調用 過程,則 也可以傳遞例程參數或本地例程變量,如IN 或INOUT參數。)對於INOUT參數,在傳遞它之前初始化其值 步驟。下面的過程有一個OUT 參數的程序設置爲當前服務器版本,並 的INOUT值從當前 值的過程遞增一:

CREATE PROCEDURE p (OUT ver_param VARCHAR(25), INOUT incr_param INT) 
BEGIN 
    # Set value of OUT parameter 
    SELECT VERSION() INTO ver_param; 
    # Increment value of INOUT parameter 
    SET incr_param = incr_param + 1; 
END; 
+0

所以這就是CALL回傳if OUT和INOUT不使用?它不傳遞值而不使用OUT和INOUT?例如,我的問題中的第一個存儲過程沒有使用OUT或INOUT,但CALL正在傳回值?我不明白。 – oshirowanen 2013-03-26 11:00:12

6

由於從MySQL文檔上引述PROCEDURE

對於每個OUT或INOUT參數,傳遞一個用戶定義的變量在調用該過程的 CALL語句,這樣就可以得到其 值時第e過程返回。如果您正在從另一個存儲過程或函數中調用 ,則還可以將 例程參數或本地例程變量作爲IN或INOUT 參數傳遞。


後來,一個例子:

mysql> CREATE PROCEDURE simpleproc (OUT param1 INT) 
    -> BEGIN 
    -> SELECT COUNT(*) INTO param1 FROM t; 
    -> END// 
Query OK, 0 rows affected (0.00 sec) 

mysql> delimiter ; 

mysql> CALL simpleproc(@a); 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT @a; 
+------+ 
| @a | 
+------+ 
| 3 | 
+------+ 
1 row in set (0.00 sec) 
+0

因此,如果OUT和INOUT未被使用,那麼CALL傳回?它不傳遞值而不使用OUT和INOUT?例如,我的問題中的第一個存儲過程沒有使用OUT或INOUT,但CALL正在傳回值?我不明白。 – oshirowanen 2013-03-26 10:59:54

+0

@oshirowanen也許我誤解了你的問題。你能解釋一下嗎? 「IN」就像是將一個值傳遞給函數/過程。 'OUT'只能在'PROCEDURE'中使用,你可以用它來返回自定義數據。 'INOUT'是雙向的。 – hjpotter92 2013-03-26 11:06:50

+0

基本上,我不明白爲什麼'OUT'存在,如果一個CALL接收回數據而不必使用'OUT'。 – oshirowanen 2013-03-26 11:09:36

0

使用該OUT關鍵字的以下文章中陳述

13.2.1. CALL Syntax

CALL可使用是 聲明爲OUT或INOUT參數參數值傳回它的調用者。

+0

因此,如果OUT和INOUT未被使用,那麼CALL會傳回?它不傳遞值而不使用OUT和INOUT?例如,我的問題中的第一個存儲過程沒有使用OUT或INOUT,但CALL正在傳回值?我不明白。 – oshirowanen 2013-03-26 10:53:53

相關問題