2016-09-27 52 views
2

我正在开发一个MySQL函数,该函数的功能应该是JSON_MERGE(我的部署服务器是MySQL 5.5.51),并且我得到CONCAT MySQL函数的空返回值。一段代码更好的解释:MySQL CONCAT返回null和两个有效字符串

IF(v_json is not null AND v_fianlJson is not null) THEN 
     return CONCAT(v_fianlJson, v_json); 
    END IF; 

我不明白为什么这个concat的结果是null。你能看到我失踪的东西吗?

我正在粘贴下面的全部功能。在我的本地环境(MySQL 5.5.42)中,这个函数使用相同的数据。

USE `o2stag`; 
DROP function IF EXISTS `getApplicationData`; 

DELIMITER $$ 
USE `stag`$$ 

CREATE DEFINER=`root`@`localhost` FUNCTION `getApplicationData`(pApplication_id INT) RETURNS text CHARSET latin1 
BEGIN 
    DECLARE v_id INT DEFAULT NULL; 
    DECLARE v_json TEXT DEFAULT NULL; 
    DECLARE v_finalJson TEXT DEFAULT NULL; 

    SELECT 
     id, data INTO v_id, v_json 
    FROM application_data 
    WHERE application_id = pApplication_id ORDER BY id LIMIT 1; 

    WHILE (v_id is not null) DO 

     IF(v_finalJson is null AND v_json is not null) THEN 
      SET v_finalJson = v_json;  
     ELSE 

      IF(v_finalJson is not null AND v_json is not null) THEN    
       SET v_finalJson = CONCAT(CONCAT(LEFT(v_finalJson, CHAR_LENGTH(v_finalJson) -1), ''),',', SUBSTRING(v_json, 2));    
      END IF; 

     END IF; 
     #--------------------------------------------------------------- 
     # Just to control the logic cursor 
     IF(SELECT 1=1 FROM application_data WHERE application_id = pApplication_id AND id > v_id ORDER BY id LIMIT 1) THEN 
      SELECT id, data INTO v_id, v_json FROM application_data 
      WHERE application_id = pApplication_id 
       AND id > v_id ORDER BY id LIMIT 1;  
     ELSE 
      SET v_id = null; 
      SET v_json = ''; 
     END IF; 

    END WHILE;  

    RETURN v_finalJson; 
END$$ 

DELIMITER ; 

感谢所有帮助

+0

有什么确切的数据类型所涉及的变量? –

+0

@ÁlvaroGonzález都是TEXT。我看到了变量名中的拼写错误,但它在所有函数中都是一样的。这不是一个错字问题。 –

+0

我无法重现它(SQLFiddle不再功能,所以我不知道如何分享它)。我怀疑你不能用这段代码来重现它,而且这个问题只发生在你的完整函数中,因为这个错误在别的地方。我建议你只是为了调试而添加一个'ELSE'子句。 –

回答

0

我们不得不重新使用group_concat功能,它在数据库中保存了大量的查询。对于group_concat函数可以concat有一个字符的限制,我没有看如何设置concat函数的这个限制,但我相信也必须有一种方法来设置它。

新功能:

USE `stag`; 
DROP function IF EXISTS `getApplicationData`; 

DELIMITER $$ 
USE `o2stag`$$ 
CREATE DEFINER=`root`@`localhost` FUNCTION `getApplicationData`(pApplication_id INT) RETURNS text CHARSET latin1 
BEGIN 
    # creates a full json object 
    DECLARE v_finalJson TEXT DEFAULT NULL; 

    SET group_concat_max_len = 9999999999; 

    SELECT GROUP_CONCAT('{',Json,'}') INTO v_finalJson FROM(
     SELECT 
      GROUP_CONCAT(SUBSTRING(data, 2, LENGTH(data) - 2) SEPARATOR ',') AS Json 
     FROM stag.application_data 
     WHERE application_id = pApplication_id) AS TJoin; 

    RETURN v_finalJson; 

END$$ 

DELIMITER ;