mysql - 无法在 MYSQL 上的存储过程中分配局部变量

标签 mysql stored-procedures local-variables

    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/

相关文章:

在 Visual Studio 2019 中生成实体数据模型时 MySQL 崩溃

mysql - 查询以获取用户详细信息

php - 从 PHP 调用存储过程与 SQL 查询之间的区别

mysql - 创建过程 phpmyadmin

c++ - 如何使用指针从不同的函数访问局部变量?

c++ - C++ 中的局部变量通常在什么时候分配内存?

c++ - 如何使用指针从不同的函数访问局部变量?

mysql - 在插入之前创建Mysql触发器

mysql - 如何为 OSX 10.9 的 MySQL 工作台启用 SSL

c# - 使用 C# 检查文本是否已存在于 SQL Server 中