MySQL fetch следующая проблема курсора
У меня проблема с выборкой значений из курсора MySQL.
Я создаю временную таблицу, которая является простой копией другой таблицы (исходная таблица имеет имя переменной, которое передается как параметр процедуры, и поскольку MySQL не поддерживает имена переменных таблиц, я должен создать копию - не могу использовать оригинал напрямую).
создание временной таблицы идет просто отлично, все данные, которые должны быть в нем есть. Затем я определяю курсор для перебора через мой временный стол... но когда я пытаюсь извлечь из курсора в цикле while, мои переменные не заполняются данными из таблицы "cursored"... большинство из них просто NULL, только последние 2, похоже, имеют правильные значения внутри.
вот фрагмент моего кода:
-- variables to be filled from the cursor
DECLARE id,rain,snow,hs,clouds,rain2,cape,status,done int;
DECLARE v_v,v_u double;
-- cursor declaration
DECLARE iter CURSOR FOR (SELECT id,cape,rain,snow,hstones,clouds,raining,wind_u,wind_v FROM temp_tbl);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- drop the old temporary table if any
DROP TABLE IF EXISTS temp_tbl;
-- a statement to create the temporary table from a table with the specified name
-- (table_name is a parameter of the stored procedure this chunk is from)
SET @temp_table = CONCAT('CREATE TABLE temp_tbl AS SELECT * FROM ', table_name, ' WHERE 1');
-- prepare, execute and deallocate the statement
PREPARE ctmp FROM @temp_table;
EXECUTE ctmp;
DEALLOCATE PREPARE ctmp;
-- now the temp_table exists, open the cursor
OPEN iter;
WHILE NOT done DO
-- fetch the values
FETCH iter INTO id,cape,rain,snow,hs,clouds,rain2,v_u,v_v;
-- fetch doesnt work, only v_u and v_v variables are fetched correctly, others are null
-- ... further statements go here
END WHILE;
CLOSE iter;
есть ли какая-либо проверка типа в операторе FETCH, которая может вызвать такую проблему? Столбцы в моей временной таблице (которая является производной от исходной) - это просто small-ints или tiny-ints, таким образом, они должны быть полностью совместимы с ints, которые я использую в операторе fetch. Эти два последних-двойные, но странно, что только эти два двойника извлекаются. Даже столбец ID int, который является первичным ключом, не извлекается.
Я работаю с dbForge Studio, чтобы войти и отладить мои процедуры, но это не должно быть проблемой.
1 ответов
на MySQL
функции, когда имена параметров или переменных конфликтуют с именами полей, используются имена параметров или переменных.
в этих заявлениях:
DECLARE id,rain,snow,hs,clouds,rain2,cape,status,done int;
DECLARE iter CURSOR FOR (SELECT id,cape,rain,snow,hstones,clouds,raining,wind_u,wind_v FROM temp_tbl);
выбрать неинициализированные переменные, а не поля. Это то же, что:
DECLARE iter CURSOR FOR (SELECT NULL, NULL, NULL, NULL, NULL, NULL, NULL, wind_u,wind_v FROM temp_tbl);
последние два имени Поля не конфликтуют и выбраны правильно.
добавьте имена переменных с подчеркиванием:
DECLARE _id, _rain, _snow, _hs, _clouds, _rain2, _cape, _status, _done INT;