Ошибка MySQL "усеченное неверное значение DOUBLE" в процедуре
У меня проблема с моей процедурой. Я пытаюсь взять значения из таблицы продаж и сделать запрос, используя их. Процедура выглядит так:
DROP PROCEDURE IF EXISTS turnover;
DELIMITER $$
CREATE PROCEDURE turnover()
BEGIN
DECLARE col INT;
DECLARE q TEXT;
DECLARE i INT DEFAULT 0;
DECLARE m TEXT;
SET col = (SELECT count(DISTINCT article) FROM sales);
SET q = "SELECT article, ";
WHILE i < co DO
SET m = (SELECT DISTINCT month FROM sales LIMIT 1 OFFSET i);
SET q = q + "SUM(IF(month=" + m + ",value,NULL)) AS " + m;
IF i < (col - 1) THEN
SET q = q + ", ";
END IF;
SET i = i + 1;
END WHILE;
SET q = q + " FROM sales GROUP BY article";
EXECUTE q;
END$$
DELIMITER ;
CALL turnover();
Я получаю ошибку:
Код ошибки: 1292. Усеченное неверное значение DOUBLE: ',value,NULL)) AS '
Как я могу сделать это работает?
Благодарю.
2 ответа
col
проблема была исправлена или предположена ниже.
CREATE SCHEMA safe_Tuesday_01; -- safe sandbox
USE safe_Tuesday_01; -- DO the work in this db to test it
-- a fake table, we need something
create table sales
( article varchar (100) not null,
month int not null
);
Шаг 1, выясните, как выглядит строка:
DROP PROCEDURE IF EXISTS turnover;
DELIMITER $$
CREATE PROCEDURE turnover()
BEGIN
DECLARE col INT;
DECLARE q TEXT;
DECLARE i INT DEFAULT 0;
DECLARE m TEXT;
SET col = (SELECT count(DISTINCT article) FROM sales);
SET q = "SELECT article, ";
WHILE i < col DO
SET m = (SELECT DISTINCT month FROM sales LIMIT 1 OFFSET i);
SET q = CONCAT(q,"SUM(IF(month=" + m + ",value,NULL)) AS ", m);
IF i < (col - 1) THEN
SET q = q + ", ";
END IF;
SET i = i + 1;
END WHILE;
SET q = CONCAT(q," FROM sales GROUP BY article");
select q;
-- EXECUTE q; -- No no no this is wrong anyway
END$$
DELIMITER ;
CALL turnover();
ВЫБРАТЬ артикул, ОТ ПРОДАЖ
Хорошо что выше SELECT
выглядит не так жарко. Повторно исправьте свою логику на шаге 1, чтобы исправить эту строку.
Шаг 2, когда вы исправите приведенный выше код, перейдите к следующему. Обратите внимание, на данный момент это не исправлено. Так что, опять же, выше.
Но ниже используйте правильную PREPARED STATEMENT
который ты не
DROP PROCEDURE IF EXISTS turnover;
DELIMITER $$
CREATE PROCEDURE turnover()
BEGIN
DECLARE col INT;
DECLARE q TEXT;
DECLARE i INT DEFAULT 0;
DECLARE m TEXT;
SET col = (SELECT count(DISTINCT article) FROM sales);
SET q = "SELECT article, ";
WHILE i < col DO
SET m = (SELECT DISTINCT month FROM sales LIMIT 1 OFFSET i);
SET q = CONCAT(q,"SUM(IF(month=" + m + ",value,NULL)) AS ", m);
IF i < (col - 1) THEN
SET q = q + ", ";
END IF;
SET i = i + 1;
END WHILE;
SET q = CONCAT(q," FROM sales GROUP BY article");
-- select q;
SET @theSQL=q;
PREPARE stmt1 FROM @theSQL;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END$$
DELIMITER ;
Когда закончите,
DROP SCHEMA safe_Tuesday_01; -- clean up, poof, sandbox is gone
CONCAT
твой друг. Вы пропустили этот шаг. Важно, чтобы PREPARE
работает против пользовательской переменной (с @
знак), а не местный вар (из DECLARE
) иначе оно взорвется. Так что я исправил это с помощью @theSQL
Снова, см. Страницу руководства MySQL ПОДГОТОВЬТЕ Синтаксис. Важно, чтобы ваша строка была правильной. В этом суть шага 1. Только тогда вы переходите к шагу 2 и используете его.
Бывает когда SELECT DISTINCT month FROM sales
ничего не возвращает. На следующей строке фрагмент запроса генерируется как SUM(IF(month=,value,NULL)) AS
и, конечно, там есть ошибка (возможно, MySQL не выдает правильное сообщение об ошибке, но именно здесь ошибка).
И причиной ошибки является WHILE
линия, которая сравнивает i
против неизвестной переменной co
, Вероятно, следует читать:
WHILE i < col DO
Но это не решает проблему, потому что col
это число различных значений article
и вы перебираете от 1 до col
над различными значениями month
, Скорее всего, они в разном количестве, и если количество статей будет больше, тогда ошибка повторится.