CREATE DEFINER=`root`@`localhost` PROCEDURE `add_item`(
IN parentId BIGINT UNSIGNED, IN jobId BIGINT UNSIGNED,
OUT id BIGINT UNSIGNED)
BEGIN
DECLARE newLeft INT UNSIGNED DEFAULT 0;
SELECT `RGT` into newLeft from `headings` where `ID`=parentId LIMIT 1;
/* ERROR TRAP */
IF (newLeft=0) OR (newLeft=NULL) THEN SET newLeft=1;
END IF;
问题是我无法将结果选择到局部变量 newLeft 中,它始终等于 1(如果我删除了错误陷阱,则为 0)。我错过了什么吗?我尝试了很多不同的方法,甚至将“INTO newLeft”放在 SELECT 语句的末尾。
在使用IIs的Windows 7测试机上使用MYSQL 5.4
最佳答案
解决方案:
MYSQL 在使用存储过程中的表选择中的字段之前,如果它们是同名的,并且不区分大小写,则会使用局部变量或参数。注意 where ID
=parentId 部分,它实际上是询问 where 0=parentId(此时变量 id=0),因为 ID 是一个局部参数,也是一个字段表,但局部变量有优先权。
将 OUT 参数名称从 id 更改为 outid 解决了这个问题。
我想我可以将选择更改为:
SELECT `RGT` into newLeft from `headings` where `headings`.`ID`=parentId LIMIT 1;
我没有尝试这个,我只是更改了 OUT 参数名称。
关于mysql - 无法在 MYSQL 上的存储过程中分配局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16045751/