Я работаю над функцией 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 ;
Спасибо за любую помощь
Каковы точные типы данных вовлеченных переменных? –
@ ÁlvaroGonzález оба являются ТЕКСТ. Я видел опечатку в имени переменной, но она одинакова во всех функциях. Это не опечатка. –
Я не могу воспроизвести его (SQLFiddle больше не работает, поэтому я не знаю, как его разделить). Я подозреваю, что вы не можете воспроизвести его ни с помощью этого кода, и проблема возникает только в вашей полной функции, потому что ошибка находится где-то в другом месте. Я предлагаю вам добавить предложение «ELSE» в любом случае только для отладки. –