2012-05-08 32 views
3

這可能是對你最微不足道的問題,自定義錯誤信息......下面是一個存儲功能我已經在MySQL創建:如何在MySQL存儲功能

DROP PROCEDURE IF EXISTS teamSize; 
DELIMITER // 

CREATE PROCEDURE teamSize(IN teamName VARCHAR(50), IN teamYear INT(4), OUT noOfPlayers INT) 
BEGIN 
    IF teamName IN (SELECT teamName FROM team) THEN 
     SELECT COUNT(playerID) INTO noOfPlayers 
     FROM team 
     JOIN teamAllocation 
     ON teamAllocation.teamID = team.teamID 
     WHERE team.teamName = teamName 
     AND team.teamYear = teamYear; 
    ELSE 
     SELECT "That team does not exist in the database" AS "Error Message"; 
    END IF; 
END // 

DELIMITER ; 

我做了這個功能,所以我可以計算給定年份中給定團隊的規模。團隊名稱和團隊年份被解析爲參數值。對於這個功能,如果數據庫中不存在輸入用戶的團隊名稱,則需要顯示用戶友好的錯誤消息。

例如:我在一個團隊,確實存在我得到下面的結果類型,如我所料:

mysql> CALL teamSize("U11 Orange", 2012, @noOfPlayers); 
-------------- 
CALL teamSize("U11 Orange", 2012, @noOfPlayers) 
-------------- 

Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT @noOfPlayers; 
-------------- 
SELECT @noOfPlayers 
-------------- 

+--------------+ 
| @noOfPlayers | 
+--------------+ 
|   2 | 
+--------------+ 
1 row in set (0.00 sec) 

mysql> 

......但是,如果我在一個團隊,我知道在不存在輸入我得到以下數據庫:

mysql> CALL teamSize("jkgefkrkvbey", 2012, @teamSize); 
-------------- 
CALL teamSize("jkgefkrkvbey", 2012, @teamSize) 
-------------- 

Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT @teamSize; 
-------------- 
SELECT @teamSize 
-------------- 

+-----------+ 
| @teamSize | 
+-----------+ 
|   0 | 
+-----------+ 
1 row in set (0.00 sec) 

mysql> 

我所想的,團隊名稱解析爲函數不存在的情況是類似以下內容:

+------------------------------------------+ 
| Error Message       | 
+------------------------------------------+ 
| That team does not exist in the database | 
+------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> 

如果有人對我如何實現上述內容有所反饋或建議,我們將非常感謝。

在此先感謝!

回答

2

我認爲你的問題是術語teamName的超載。由於teamName是你的程序的參數,下面的查詢:

SELECT teamName FROM team 

等同於:

SELECT 'foo' FROM team 

這將始終在team(因此IF 'foo' IN ...條件返回字符串'foo'一次爲每個記錄總是如此)。建議您重命名參數,以避免與列名稱相沖突。

此外,您不需要以您的方式執行IF。相反,爲什麼不:

IF (SELECT COUNT(*) FROM team WHERE teamName = new_parameter_name) THEN ... 

順便說一句,我寧願養一個SQL錯誤(例如,通過調用一個不存在的程序),而不是返回一個消息字符串。