MYSQL存储过程:变量声明和条件语句
我已经查阅了很多教程、手册和文档,但我仍然无法将其付诸实施 我正在尝试使用phpMyAdmin创建一个存储过程 我似乎找不到这里的错误,sql错误是如此模糊MYSQL存储过程:变量声明和条件语句,mysql,sql,stored-procedures,variable-declaration,Mysql,Sql,Stored Procedures,Variable Declaration,我已经查阅了很多教程、手册和文档,但我仍然无法将其付诸实施 我正在尝试使用phpMyAdmin创建一个存储过程 我似乎找不到这里的错误,sql错误是如此模糊 CREATE PROCEDURE insertToonOneShot(IN locale CHAR(2), IN name VARCHAR(16), IN realm VARCHAR(24), IN faction CHAR(1), IN toon_level INT, IN class_name INT) BEGIN DECLARE @r
CREATE PROCEDURE insertToonOneShot(IN locale CHAR(2), IN name VARCHAR(16), IN realm VARCHAR(24), IN faction CHAR(1), IN toon_level INT, IN class_name INT)
BEGIN
DECLARE @realmID INT;
DECLARE @classID INT;
DECLARE @toonID INT;
SET @realmID = SELECT id FROM realms WHERE realms.name = realm;
SET @classID = SELECT id FROM classes WHERE classes.name = class_name;
IF NOT @realmID IS NULL AND NOT @classID IS NULL AND @toonID IS NULL THEN
INSERT INTO
toon (`locale`, `name`, `realm_id`, `faction`, `level`, `class_id`)
VALUES
(locale, name, @realmID, faction, toon_level, @classID);
END IF;
END;
我现在遇到的错误是:
#1064-您的SQL语法有错误;检查手册
对应于您的MySQL服务器版本,以便使用正确的语法
近@realmID INT;声明@classID INT;声明@toonID INT;设置@rea
在3号线
可能是我做过的最令人沮丧的事情之一
我在网上看到了很多教程,其中显示了在变量声明中使用@符号,还有一些没有使用,我甚至看到了一些使用VAR而不是DECLARE的教程。正确的语法是什么 当您有子查询时,它需要有括号。这些线路:
SET @realmID = SELECT id FROM realms WHERE realms.name = realm;
SET @classID = SELECT id FROM classes WHERE classes.name = class_name;
应该是:
SET @realmID = (SELECT id FROM realms WHERE realms.name = realm);
SET @classID = (SELECT id FROM classes WHERE classes.name = class_name);
或者,更好的是,您不需要设置:
SELECT @realmID := id FROM realms WHERE realms.name = realm;
SELECT @classID := id FROM classes WHERE classes.name = class_name;
这就是诀窍:
CREATE PROCEDURE insertToonOneShot(IN locale CHAR(2), IN name VARCHAR(16), IN realm VARCHAR(24), IN faction CHAR(1), IN toon_level INT, IN class_name VARCHAR(12))
BEGIN
SELECT @realmID := id FROM realms WHERE realms.name = realm;
SELECT @classID := id FROM classes WHERE classes.name = class_name;
SELECT @toonID := id FROM toon WHERE toon.name = name AND toon.realm_id = @realmID;
IF NOT @realmID IS NULL AND NOT @classID IS NULL AND @toonID IS NULL
THEN
INSERT INTO toon (`locale`, `name`, `class_id`, `realm_id`, `faction`, `level`)
VALUES (locale, name, @classID, @realmID, faction, toon_level);
END IF;
END;
//
显然,声明声明不是必需的。。。谁会知道呢
感谢戈登·林诺夫为我指明了正确的方向 老问题,但我认为值得一提的是,它似乎混淆了会话变量(前缀为@
)和过程变量(前缀为@
)
接受的解决方案可以解决错误,但如果在过程外部定义变量,然后在过程内部使用,则可能会引入与变量范围相关的问题。解决此问题的正确方法是仅使用程序变量:
DELIMITER $$
CREATE PROCEDURE insertToonOneShot(
IN locale CHAR(2),
IN name VARCHAR(16),
IN realm VARCHAR(24),
IN faction CHAR(1),
IN toon_level INT,
IN class_name INT
)
BEGIN
DECLARE realmID INT;
DECLARE classID INT;
SELECT id INTO realmID FROM realms WHERE realms.name = realm LIMIT 1;
SELECT id INTO classID FROM classes WHERE classes.name = class_name LIMIT 1;
IF realmID IS NOT NULL AND classID IS NOT NULL THEN
INSERT INTO toon (`locale`, `name`, `realm_id`, `faction`, `level`, `class_id`)
VALUES (locale, name, realmID, faction, toon_level, classID);
END IF;
END$$
DELIMITER ;
我实现了@realmID:=id..
方法。仍然在第3行收到相同的错误。它似乎不喜欢DECLARE语句。@Gordon是我们不需要声明数据类型?是我们需要使用@
符号吗?在我的sp中,没有@
while声明。@AvinashRaj。OP在问题中使用了会话变量,所以这个答案也使用了它们。您可以在此处了解差异:。此代码应同时使用本地变量和会话变量。在使用前缀为@的会话变量和前缀为@的过程变量之前,请注意并理解它们之间的区别。两者之间的区别在于,每次调用过程时,过程变量都会重新初始化为NULL,而会话特定变量则不会。设想一个场景,在父过程中使用相同的会话变量。