MySQL存储过程变量返回NULL

时间:2014-03-13 19:44:36

标签: 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完成后似乎超出了范围,但其他两个并没有。

感谢您提供的任何帮助。

2 个答案:

答案 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语句中必须使用列限定符来区分参数名称。否则,它们将被作为参数值处理和替换;

请参阅SQL Fiddle Example

在您的情况下,由于条件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