我有一个存储过程,它将其中一个变量设置为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完成后似乎超出了范围,但其他两个并没有。
感谢您提供的任何帮助。
答案 0 :(得分:0)
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
如上所述,两者都被解释为自我平等测试,例如: where 1 = 1
。 mysql无法知道client_id
的{{1}}上的=
应该是您传入存储过程的参数,因此两个client_id都将被视为字段名。
由于第二个查询可能会返回多行数据,并且您尝试将该结果分配到单个变量中,因此您将获得NULL。
答案 1 :(得分:0)
如果已定义参数名称以与一个或多个表列匹配,则在SQL语句中必须使用列限定符来区分参数名称。否则,它们将被作为参数值处理和替换;
在您的情况下,由于条件client_id = CLIENT_ID
导致(可能)获取多个记录,因此它们不能分配给非游标类型的变量。因此返回了NULL
,即用户定义变量的默认值。
更改您的程序正文如下:
CREATE DEFINER=`xxx`@`localhost` PROCEDURE `test`(IN CLIENT_ID INT)
BEGIN
DECLARE BEGIN_RANGE INT UNSIGNED DEFAULT 0;
select c.client_id into @CLIENT_ID3
from clients c
where c.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 c.latest_invoice_id
from SQL_AuditPro.clients c
where c.client_id = CLIENT_ID);
END