尽管查询返回结果,但我有一个存储过程将其中一个变量设置为 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/