2010-02-25 58 views
7

我有一个从MySQL游标中获取值的问题。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一起工作,进入并调试我的过程,但这不应该是问题。

回答

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; 
+0

非常感谢!像魅力一样工作。 – NumberFour 2010-02-25 15:22:49

+0

太棒了,我有同样的问题。谢谢! – sohtimsso1970 2010-07-22 15:09:52

+0

搞笑但很明显,一旦你看到问题。变量会影响字段名称,而mysql不会给出警告。 – 2016-02-18 22:22:16