2014-10-10 58 views
0

我需要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

回答

1

的所有聲明必須被放置在開始程序:

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