[英]an error with my MySQL script syntax
I'm trying to create a stored function, but an error is appeared which driving me crazy, I really don't know what's the problem with my script, I think there is no error in it, but I don't know why I'm getting this error : 我正在尝试创建一个存储的函数,但是出现了一个错误,这使我发疯,我真的不知道脚本有什么问题,我认为其中没有错误,但是我不知道为什么正在收到此错误:
1064 - You have an error in your SQL syntax;
1064-您的SQL语法有误; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE cr1 CURSOR FOR SELECT codeArt, qte FROM LigneBonEntrée WHERE numBon = '
检查与您的MySQL服务器版本相对应的手册,以在'DECLARE cr1 CURSOR FOR SELECT codeArt,qte FROMLigneBonEntréeWHERE numBon ='附近使用正确的语法。
And this is my script : 这是我的脚本:
DELIMITER $$
CREATE DEFINER=root@localhost FUNCTION verifierQteDemandee(numBonIn INT) RETURNS BOOLEAN
BEGIN
DECLARE numLignesBonEntrée, numLignesBonSortie INTEGER;
DECLARE codeArtLigneBonEntrée, codeArtLigneBonSortie, qteLigneBonEntrée, qteLigneBonSortie INTEGER;
DECLARE no_more_rows BOOLEAN;
DECLARE qteArticle INTEGER;
DECLARE test BOOLEAN DEFAULT TRUE;
SET numLignesBonEntrée = (SELECT COUNT(*) FROM LigneBonEntrée WHERE numBon = numBonIn);
SET numLignesBonSortie = (SELECT COUNT(*) FROM numLignesBonSortie WHERE numBon = (SELECT estLieA FROM LigneBonEntrée WHERE numBon = numBonIn));
IF numLignesBonEntrée <> numLignesBonSortie THEN
SET test = FALSE;
ELSE
DECLARE cr1 CURSOR FOR SELECT codeArt, qte FROM LigneBonEntrée WHERE numBon = numBonIn ORDER BY codeArt ASC;
DECLARE cr2 CURSOR FOR SELECT codeArt, qte FROM LigneBonSortieWHERE numBon = (SELECT estLieA FROM LigneBonEntréeWHERE numBon = numBonIn) ORDER BY codeArt ASC;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET no_more_rows = TRUE;
OPEN cr1;
OPEN cr2;
the_loop: LOOP
FETCH cr1 INTO codeArtLigneBonEntrée, qteLigneBonEntrée;
FETCH cr2 INTO codeArtLigneBonSortie, qteLigneBonSortie;
IF no_more_rows THEN
CLOSE cr;
LEAVE the_loop;
END IF;
IF codeArtLigneBonEntrée <> codeArtLigneBonSortie THEN
SET test = FALSE;
END IF;
IF qteLigneBonEntrée <> qteLigneBonSortie THEN
SET test = FALSE;
END IF;
END LOOP the_loop;
END IF;
RETURN test;
END$$
DELIMITER ;
All of your DECLARE's must be at the top of the procedure, before any other logic. 您的所有DECLARE必须位于该过程的顶部,然后再执行其他任何逻辑。 Give the following a try.
请尝试以下方法。
DELIMITER $$
CREATE DEFINER=root@localhost FUNCTION verifierQteDemandee(numBonIn INT) RETURNS BOOLEAN
BEGIN
DECLARE numLignesBonEntrée, numLignesBonSortie INTEGER;
DECLARE codeArtLigneBonEntrée, codeArtLigneBonSortie, qteLigneBonEntrée, qteLigneBonSortie INTEGER;
DECLARE no_more_rows BOOLEAN;
DECLARE qteArticle INTEGER;
DECLARE test BOOLEAN DEFAULT TRUE;
-- Moved declarations to before other logic
DECLARE cr1 CURSOR FOR SELECT codeArt, qte FROM LigneBonEntrée WHERE numBon = numBonIn ORDER BY codeArt ASC;
DECLARE cr2 CURSOR FOR SELECT codeArt, qte FROM LigneBonSortieWHERE numBon = (SELECT estLieA FROM LigneBonEntréeWHERE numBon = numBonIn) ORDER BY codeArt ASC;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET no_more_rows = TRUE;
SET numLignesBonEntrée = (SELECT COUNT(*) FROM LigneBonEntrée WHERE numBon = numBonIn);
SET numLignesBonSortie = (SELECT COUNT(*) FROM numLignesBonSortie WHERE numBon = (SELECT estLieA FROM LigneBonEntrée WHERE numBon = numBonIn));
IF numLignesBonEntrée <> numLignesBonSortie THEN
SET test = FALSE;
ELSE
OPEN cr1;
OPEN cr2;
the_loop: LOOP
FETCH cr1 INTO codeArtLigneBonEntrée, qteLigneBonEntrée;
FETCH cr2 INTO codeArtLigneBonSortie, qteLigneBonSortie;
IF no_more_rows THEN
CLOSE cr;
LEAVE the_loop;
END IF;
IF codeArtLigneBonEntrée <> codeArtLigneBonSortie THEN
SET test = FALSE;
END IF;
IF qteLigneBonEntrée <> qteLigneBonSortie THEN
SET test = FALSE;
END IF;
END LOOP the_loop;
END IF;
RETURN test;
END$$
DELIMITER ;
Mysql documentation : http://dev.mysql.com/doc/refman/5.0/en/declare.html Mysql文档: http : //dev.mysql.com/doc/refman/5.0/en/declare.html
DECLARE is permitted only inside a BEGIN ... END compound statement and must be at its start, before any other statements.
仅在BEGIN ... END复合语句中允许使用DECLARE,并且必须在其开始处以及其他任何语句之前。
Declarations must follow a certain order.
声明必须遵循一定顺序。 Cursor declarations must appear before handler declarations.
游标声明必须出现在处理程序声明之前。 Variable and condition declarations must appear before cursor or handler declarations.
变量和条件声明必须出现在游标或处理程序声明之前。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.