2016-09-27 2 views
2

Я работаю над функцией MySQL, которая должна функционировать как JSON_MERGE (мой сервер развертывания MySQL 5.5.51), и я получаю нулевой возврат из функции MySQL CONCAT. Код фрагмента для лучшего объяснения: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 оба являются ТЕКСТ. Я видел опечатку в имени переменной, но она одинакова во всех функциях. Это не опечатка. –

+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 ; 
Смежные вопросы