从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语句中是否存在可能导致此类问题的类型检查?我的临时表中的列(源自原始列)只是小的int或tiny-int,所以这些列应该与我在fetch语句中使用的int完全兼容。最后两个是双打,但奇怪的是只有这两个双打才被拿走。即使是ID int列,也不是主键。
我使用dbForge Studio来进入并调试我的程序,但这应该不是问题。
答案 0 :(得分:16)
在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;