【问题标题】:MySQL Stored Proc Variable returns NULLMySQL 存储过程变量返回 NULL
【发布时间】:2014-04-18 19:35:05
【问题描述】:

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

这里是 SP:

CREATE DEFINER=`xxx`@`localhost` PROCEDURE `test`(IN CLIENT_ID INT) 开始 DECLARE BEGIN_RANGE INT 无符号默认值 0; 从客户端中选择 client_id 到 @CLIENT_ID3 中 client_id = CLIENT_ID 限制 1; SET @BEGIN_RANGE =(从计数器中选择 var_value,其中 var_name = 'latest_report_id_summarized' 限制 1); 选择 latest_invoice_id 到 @LATEST_INVOICE_ID 来自 SQL_AuditPro.clients 其中client_id = CLIENT_ID; 结尾

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

选择@CLIENT_ID3、@BEGIN_RANGE、@LATEST_INVOICE_ID;

我明白了:

12345,2342342234,空

我也试过了:

CREATE DEFINER=`xxx`@`localhost` PROCEDURE `test`(IN CLIENT_ID INT) 开始 DECLARE BEGIN_RANGE INT 无符号默认值 0; 从客户端中选择 client_id 到 @CLIENT_ID3 其中client_id = CLIENT_ID 限制为1; SET @BEGIN_RANGE =(从计数器中选择 var_value,其中 var_name = 'latest_report_id_summarized' 限制 1); SET @LATEST_INVOICE_ID = (选择 latest_invoice_id from SQL_AuditPro.clients 其中client_id = CLIENT_ID); 结尾

同样的结果。显然我不需要 SET @CLIENT_ID3 它只是在那里进行测试。任何想法为什么这不会设置变量?当我自己运行这个查询时,我会得到一个结果,如果我运行:

选择 latest_invoice_id 到 @LATEST_INVOICE_ID 来自 SQL_AuditPro.clients 其中client_id = 12345; 选择@LATEST_INVOICE_ID;

我明白了:

2342342234

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

感谢您提供的任何帮助。

【问题讨论】:

    标签: mysql variables stored-procedures


    【解决方案1】:

    当您定义了与一个或多个表列匹配的参数名称时,在您的 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
    

    【讨论】:

      【解决方案2】:
      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 应该是您传递给存储过程的参数,因此两个client_id 都将被视为字段名称。

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

      【讨论】:

        猜你喜欢
        • 2012-11-29
        • 1970-01-01
        • 2010-12-18
        • 1970-01-01
        • 1970-01-01
        • 2021-06-11
        • 2014-08-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多