2012-04-11 77 views
0

我有這個存儲過程。當我在Wamp上的PhpMyAdmin中執行它時,它說它執行了所有事情。當我嘗試在查詢中使用它時,它說該函數不在那裏。我究竟做錯了什麼?Mysql存儲過程不存在嗎?

DELIMITER // 

CREATE PROCEDURE `sql_level`(IN exp INT) 
BEGIN 
    SELECT id 
    FROM `levels` 
    WHERE experience <= exp DESC LIMIT 1; 
     id = id-1; 
END // 

DELIMITER ; 

這是我試圖運行的查詢。

$id = 1; 
if($stmt->prepare("SELECT sql_level(attack) FROM `users` WHERE id = ?")) { 
$stmt->bind_param('i',$id); 
$stmt->execute(); 
$stmt->bind_result($attack); 
$stmt->fetch(); echo "<h1 align='center'>".$attack."</h1>"; } 
else { die($stmt->error); } 

謝謝。

+1

您是否檢查過SP是否可用於您從應用中使用它的用戶帳戶? phpmyadmin通常有一個超級用戶級別的賬戶來訪問mysql,而你的應用很可能不會。 – 2012-04-11 17:28:37

+0

當我嘗試在查詢中使用它時,它說這個函數不在那裏。: - 你能在這裏提供你的查詢嗎? – 2012-04-11 17:28:46

+0

編輯。另外,我是最高用戶。它運行在我的本地環境中。 – AlanPHP 2012-04-11 17:32:33

回答

0
DELIMITER | 
CREATE FUNCTION `sql_level`(exp INT) 
RETURNS INT 
DETERMINISTIC 
BEGIN 
DECLARE ReturnId INT; 

SELECT id-1 INTO ReturnId 
FROM `levels` 
WHERE experience <= exp; 

RETURN ReturnId; 
END; 

這是我最後使用,使其工作。謝謝!希望這可以幫助別人!

1

您想創建您的例程作爲function而不是存儲過程。

DELIMITER // 

CREATE FUNCTION `sql_level`(exp INT) 
RETURNS INT 
BEGIN 
    DECLARE ReturnId INT; 

    SELECT id-1 INTO ReturnId 
    FROM `levels` 
    WHERE experience <= exp DESC LIMIT 1; 

    RETURN ReturnId; 
END // 

DELIMITER ; 
+0

我收到一個錯誤。 #1064 - 你的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,在「DESC LIMIT 1」附近使用正確的語法; id = id-1;返回ID; END'在第6行 – AlanPHP 2012-04-12 00:01:15

+0

凹凸。請?? :) – AlanPHP 2012-04-12 13:50:41

+0

@AlanPHP:對不起,延遲。編輯答案。 – 2012-04-12 13:54:12