2012-04-11 78 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