[MySQL] 如何接收 Store Procedure 的傳回值

延續上一篇文章 [SQL Server] 如何接收 Store Procedure 的傳回值,這次來說明接收 MySQL 傳回值的部份。

Store Procedure 要將資料傳回一般有 2 種方式:
1. 使用 SELECT 以表格方式傳回。
2. 設定 Output Parameter 以參數方式傳回。

因為 MySQL 預儲程序不支援 RETURN 的方法,若要使用 RETURN 傳回資料可使用 FUNCTION 來傳回。
Function 傳回方式:
1. 使用 RETURN 傳回單一資料。
以下列出這 3 種傳回方式的接收方法...

延續上一篇文章 [SQL Server] 如何接收 Store Procedure 的傳回值,這次來說明接收 MySQL 傳回值的部份。

Store Procedure 要將資料傳回一般有 2 種方式:

  1. 使用 SELECT 以表格方式傳回。
  2. 設定 Output Parameter 以參數方式傳回。

因為 MySQL 預儲程序不支援 RETURN 的方法,若要使用 RETURN 傳回資料可使用 FUNCTION 來傳回。

Function 傳回方式:

  1. 使用 RETURN 傳回單一資料。

以下列出這 3 種傳回方式的接收方法,而程式在進行資料庫連線時是使用 Connector/Net 5.2 版的元件進行連線。

 

一、使用 SELECT 以表格方式傳回

Store Procedure:

  1. DROP PROCEDURE IF EXISTS mysp_QryData;  
  2. CREATE PROCEDURE mysp_QryData (  
  3. id int 
  4. )  
  5. BEGIN 
  6.     SELECT LastName, FirstName  
  7.       FROM Customer  
  8.      WHERE CustomerID = id;  
  9. END 

 

C#

  1. MySqlConnection conn = new MySqlConnection(strConn);  
  2. MySqlCommand cmd = new MySqlCommand(string.Empty, conn);  
  3. conn.Open();  
  4.  
  5. cmd.Parameters.Clear();  
  6. cmd.CommandType = CommandType.StoredProcedure;  
  7. cmd.CommandText = "mysp_QryData";  
  8. cmd.Parameters.Add("?id", MySqlDbType.Int32).Value = 1;  
  9.  
  10. MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow);  
  11.  
  12. if (reader.HasRows)  
  13. {  
  14.     reader.Read();  
  15.     Console.WriteLine("Last Name:" + reader["LastName"]);  
  16.     Console.WriteLine("First Name:" + reader["FirstName"]);  
  17. }  
  18.  
  19. reader.Close();  
  20. reader.Dispose();  
  21.  
  22. conn.Close();  
  23. conn.Dispose();

此例是以 ExecuteReader() 來進行讀取,然後配合 SqlDataReader 物件將欄位值讀出。

因傳回的內容只有 1 個資料集,所以第 10 行在讀取時可以使用 CommandBehavior.SingleRow 來接收傳回的資料集,可結省資源及增進效率,但要注意,若是傳回的內容有 2 個資料集以上,那麼使用 CommandBehavior.SingleRow 就無法讀到第 2 個以後的資料集內容了。

假設傳回內容只有 1 個傳回值,或是只要讀取傳回的第 1 筆資料的第 1 個欄位值,可以使用 ExecuteScalar() 將 LastName 讀出,如此上面 10~20 行的程式可改為如下:

  1. string strName = Convert.ToString(cmd.ExecuteScalar());  
  2. Console.WriteLine("Last Name:" + strName);

 

二、設定 Output Parameter 以參數方式傳回

Store Procedure:

  1. CREATE PROCEDURE mysp_QryData2 (  
  2. id int,  
  3. out lname varchar(30)  
  4. )  
  5. BEGIN 
  6.     SELECT LastName INTO lname 
  7.       FROM Customer  
  8.      WHERE CustomerID = id;  
  9. END

關鍵在第 3 行,在參數前方加上 out 設定為輸出參數 (註:SQL Server 是在參數後方加上 output)。

 

在另一支預儲程序中要接收此預儲程序傳回的輸出參數方法如下:

  1. CALL mysp_QryData2(1, @lname);  
  2. SELECT @lname;

第 1 行:在執行預儲程序後方直接指定要接收傳回值的變數即可。 

 

C#

第 10 行:建立要接收輸出的參數名稱資料,參數名稱 ?lname 須與預儲程序中的參數名稱一樣。
第 11 行:設定為輸出參數。
第 15 行:用 .value 將傳回資料取出。

 

三、Function 使用 RETURN 傳回單一數值

因為 MySQL 預儲程序不支援 RETURN 的方法,後來我測試用 FUNCTION 使用 RETURN 傳回資料,而 .NET 程式使用 CommandType = StoredProcedure 並設定 RETURN 參數可成功接收,程式碼如下。

MySQL Function:

將資料讀出後,使用 RETURN 傳回資料。

 

在 MySQL 中呼叫 Function 將值接回的寫法:

  1. SET @lname = func_QryData3(1);  
  2. SELECT @lname;

 

C#

第 6 行:雖然程式是呼叫 Function,但可設定成 CommandType = StoredProcedure 來呼叫。
第 10 行:建立要接收 RETURN 的參數,參數名稱 ?ReturnValue 可自定。
第 11 行:將參數設定為 Return Value。
第 15 行:用 .value 將傳回資料取出。

 

參考資料: