MySQL 存储过程变量返回 NULL

标签 mysql variables stored-procedures

尽管查询返回结果,但我有一个存储过程将其中一个变量设置为 NULL。

这是 SP:

    CREATE DEFINER=`xxx`@`localhost` PROCEDURE `test`(IN CLIENT_ID INT)
    BEGIN
        DECLARE BEGIN_RANGE INT UNSIGNED DEFAULT 0;
        select client_id into @CLIENT_ID3 from clients where 
client_id = CLIENT_ID limit 1;
        SET @BEGIN_RANGE = (select var_value from counter where var_name = 
'latest_report_id_summarized' limit 1);

        SELECT latest_invoice_id into @LATEST_INVOICE_ID from
 SQL_AuditPro.clients where client_id = CLIENT_ID;
    END

当我运行 sp 时,然后选择结果:

select @CLIENT_ID3,@BEGIN_RANGE,@LATEST_INVOICE_ID;

我明白了:

12345,2342342234,NULL

我也尝试过:

CREATE DEFINER=`xxx`@`localhost` PROCEDURE `test`(IN CLIENT_ID INT)
BEGIN
    DECLARE BEGIN_RANGE INT UNSIGNED DEFAULT 0;
    select client_id into @CLIENT_ID3 from clients 
where client_id = CLIENT_ID limit 1;
    SET @BEGIN_RANGE = (select var_value from counter where var_name = 
'latest_report_id_summarized' limit 1);

    SET @LATEST_INVOICE_ID = (SELECT latest_invoice_id from
 SQL_AuditPro.clients where client_id = CLIENT_ID);
END

相同的结果。显然我不需要 SET @CLIENT_ID3 它只是在那里进行测试。知道为什么这不会设置变量吗?当我单独运行此查询时,我会得到结果,如果我运行:

SELECT latest_invoice_id into @LATEST_INVOICE_ID from 
SQL_AuditPro.clients where client_id = 12345;
select @LATEST_INVOICE_ID;

我明白:

2342342234

我尝试过声明该变量,而不是声明它,但看起来这个变量似乎在 SP 完成后超出了范围,但其他两个却没有。

感谢您提供的任何帮助。

最佳答案

select client_id into @CLIENT_ID3 from clients where client_id = CLIENT_ID limit 1;
                                                                 ^---- missing @

SET @LATEST_INVOICE_ID = (SELECT [..snip..] where client_id = CLIENT_ID);
                                                              ^--missing @ as well

正如所写,两者都将被解释为 self 平等测试,例如其中 1 = 1。 mysql 无法知道 = 两侧的 client_id 应该是您传递给存储过程的参数,因此两个 client_id 都会被处理作为字段名称。

由于第二个查询可能返回多行数据,并且您尝试将该结果分配给单个变量,因此您将得到 NULL 作为结果。

关于MySQL 存储过程变量返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22389274/

相关文章:

使用 coalesce 优化 MySQL 查询

python - 在 Django 中选择所有具有最新时间戳的内容?

postgresql - Javascript encodeURI 类似于 postgresql 中的函数?

sql-server - 获取存储过程参数的默认值

php - 如果sql值存在php while循环将1添加到变量并执行脚本

mysql - Subsonic 2.2 + MySql 5 + StoredProcs = 'SPs' 不是 'SubSonic' 的成员?

mysql - MySQL 存储过程中的 EXECUTE 给出语法错误

MYSQL:使用数组值按列过滤

php - 如何使用具有定义为第三个非可选参数的函数

sql - 如何将 SQL 子查询分配给变量并在同一上下文中使用它