MySQL:光标从临时表中选择

问题描述:

我需要select columntemp表中存储过程cursorMySQL:光标从临时表中选择

这里是我的尝试下面的脚本:

尝试

DELIMITER $$ 
CREATE PROCEDURE `sptest2`(IN nm VARCHAR(50),IN sub VARCHAR(50)) 
BEGIN 

DECLARE dp char(50); 
DECLARE colmn_list varchar(100); 


SET @q = CONCAT('CREATE TEMPORARY TABLE IF NOT EXISTS tem AS 
(SELECT DISTINCT ', nm ,' AS Col FROM table1)'); 

PREPARE stmt FROM @q; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

DECLARE cursor_n CURSOR for select col from tem; 

注意:这使我的错误。因为我们在某些操作后不能declare cursor。我们需要在BEGIN之后声明它。

那么这是什么解决方案?

+0

我建议你不要使用游标。您可以通过子查询实现相同的功能 – 2014-10-10 11:03:19

+0

@RonakShah,对不起!但我是MySQL的新手,你能否详细说明一下? – Meem 2014-10-10 11:06:05

+0

没问题Meem,我认为你想用游标来逐行迭代并做一些处理。它会比你使用子查询或加入缓慢 – 2014-10-10 11:12:46

的所有声明必须被放置在开始程序:

DELIMITER $$ 
CREATE PROCEDURE `sptest2`(IN nm VARCHAR(50),IN sub VARCHAR(50)) 
BEGIN 

DECLARE dp char(50); 
DECLARE colmn_list varchar(100); 
DECLARE cursor_n CURSOR for select col from tem; 


SET @q = CONCAT('CREATE TEMPORARY TABLE IF NOT EXISTS tem AS 
(SELECT DISTINCT ', nm ,' AS Col FROM table1)'); 

PREPARE stmt FROM @q; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

但是根据您的要求,是一个更好的解决方案使用子查询。

在尝试创建它之前可能是一个好主意drop table,因为它的功能将被调用多次。

DROP TEMPORARY TABLE IF EXISTS tem; 
+0

但是,我怎样才能不使用'光标'多行存储到变量?我怎样才能使用子查询呢? – Meem 2014-10-10 12:31:52