MySQL извлекает следующую проблему курсора - PullRequest
7 голосов
/ 25 февраля 2010

У меня проблема с получением значений из курсора 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, которая может вызвать такую ​​проблему? Столбцы в моей временной таблице (которая получена из исходной таблицы) являются просто маленькими или маленькими, поэтому они должны быть полностью совместимы с теми, которые я использую в операторе fetch. Эти два последних являются двойными, но странно, что выбираются только эти два двойных. Даже столбец ID int, который является первичным ключом, не извлекается.

Я работаю с dbForge Studio, чтобы приступить к выполнению и отладке моих процедур, но это не должно быть проблемой.

1 Ответ

16 голосов
/ 25 февраля 2010

В 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;
...