Как понять, что вызывает усеченное неверное двойное значение ошибки в MySQL Function? - PullRequest
0 голосов
/ 09 октября 2018

У меня есть таблица, которая содержит дочерние и родительские отношения в следующей форме:

+----+-----------+
| id | nParent   |
+----+-----------+
|  1 |         0 |
|  2 |         1 |
|  3 |         2 |
|  4 |         3 |
|  5 |         3 |
|  6 |         4 |
+----+-----------+

Эта таблица представляет собой древовидную (многоуровневую, n-арную) связь между объектами, которые я хочу абстрагировать.Остальная часть приложения уже использует эту иерархию, и очень легко получить родительский дочерний элемент или дочерний элемент родительского элемента.Однако сейчас я пытаюсь решить проблему, в которой мне нужны все элементы поддерева под узлом.При поиске ответов я обнаружил удивительное решение для DBA Stack Exchange , которое создает функцию именно для этого требования.Вот мой код после необходимых изменений:

CREATE FUNCTION `GetFamilyTree`(GivenID INT) RETURNS varchar(1024) CHARSET latin1
DETERMINISTIC
BEGIN

DECLARE rv,q,queue,queue_children VARCHAR(1024);
DECLARE queue_length,front_id,pos INT;

SET rv = '';
SET queue = GivenID;
SET queue_length = 1;

WHILE queue_length > 0 DO
    SET front_id = FORMAT(queue,0);
    IF queue_length = 1 THEN
        SET queue = '';
    ELSE
        SET pos = LOCATE(',',queue) +1 ;
        SET q = SUBSTR(queue,pos);
        SET queue = q;
    END IF;
    SET queue_length = queue_length - 1;

    SELECT IFNULL(qc,'') INTO queue_children
    FROM (SELECT GROUP_CONCAT(id) qc
    FROM nodes WHERE nParent = front_id) A;

    IF LENGTH(queue_children) = 0 THEN
        IF LENGTH(queue) = 0 THEN
            SET queue_length = 0;
        END IF;
    ELSE
        IF LENGTH(rv) = 0 THEN
            SET rv = queue_children;
        ELSE
            SET rv = CONCAT(rv,',',queue_children);
        END IF;
        IF LENGTH(queue) = 0 THEN
            SET queue = queue_children;
        ELSE
            SET queue = CONCAT(queue,',',queue_children);
        END IF;
        SET queue_length = LENGTH(queue) - LENGTH(REPLACE(queue,',','')) + 1;
    END IF;
END WHILE;

RETURN rv;

END

Однако, когда я запускаю его, я получаю сообщение об ошибке Код ошибки: 1292. Сокращенное неверное значение DOUBLE '14, 15,16 '*

Я переписал функцию по частям, и отдельные сегменты (запросы и т. Д.) Работают хорошо.Но в функции выдает ошибку.

Что может быть не так?Как я могу найти именно то, что вызывает ошибку?

1 Ответ

0 голосов
/ 10 октября 2018

Ваша проблема в этой строке:

SET front_id = FORMAT(queue,0);

queue - это список значений через запятую, и MySQL не хочет преобразовывать его в числовое значение.Изменение этой строки на

SET front_id = cast(substring_index(queue, ',', 1) as unsigned);

решает проблему.Посмотрите демоверсию на rextester , где вы можете попробовать переключаться между двумя строками кода.

...