2012-10-13 59 views
1

我試圖學習mysql中的存儲過程。我知道下面的例子不需要SP,但是這僅僅是爲了我的學習目的 - 只是爲了瞭解如何循環遍歷行,並選擇行內的特定列數據。循環遍歷結果行並將列數據存儲到存儲過程變量mysql

假設表上的SELECT從我的表返回5條有下列結構 -

表名:T1 列:C1,C2,C3

我想遍歷每個5行,並且對於每一行,我想將列單元格數據存儲到SP變量varc1,varc2,varc3中,以便varc1 = c1,varc2 = c2,varc3 = c3。我將在循環內使用這些varc1,varc2,varc3進行進一步計算。

我假設需要一個存儲過程,但我沒有得到做行迭代的方法,然後從循環中考慮的行中的每一列中選取數據。

對於mysql /存儲過程來說很新。 謝謝!

回答

3

如你所知,你所要求的是對大多數問題的解決方案效率特別低。然而,既然你特意要求了它,而且(因爲偶爾)它是解決問題的唯一方法(或者你本人有時間弄清楚如何解決問題的唯一方法)。這裏是你會如何做什麼你問:

創建T1表如:

CREATE TABLE t1(id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, C1 INT, C2 INT, C3 INT); 

執行你選擇你描述如:

INSERT INTO t1 SELECT NULL,c1,c2,c3 FROM the_table; 

現在,這裏是你的行到痛苦 - 「ReeBAR」低效存儲過程:

爲您的過程準備空間並設置分隔符:

DROP PROCEDURE IF EXISTS ReeBAR; 
DELIMITER ;; 

寫你的程序:

CREATE PROCEDURE ReeBAR() 
BEGIN 
DECLARE n INT DEFAULT 0; 
DECLARE i INT DEFAULT 0; 
DECLARE varc1 INT DEFAULT 0; 
DECLARE varc2 INT DEFAULT 0; 
DECLARE varc3 INT DEFAULT 0; 
SELECT COUNT(*) into n FROM t1; 
set i=1; 
WHILE i<=n DO 
    SELECT c1 FROM t1 WHERE id=i INTO varc1; 
    SELECT c2 FROM t1 WHERE id=i INTO varc2; 
    SELECT c3 FROM t1 WHERE id=i INTO varc3; 
    --queries which couldnt be made into set based queries go here--- 
    SET i = i + 1; 
END WHILE; 
End; 

另外,如果您的ID列在不連續的,你可以使用follwoing光標形式。

CREATE PROCEDURE ReeBAR() 
BEGIN 
    DECLARE cursor_ID INT; 
    DECLARE cursor_VAL VARCHAR; 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE cursor_i CURSOR FOR SELECT c1,c2,c3 FROM t1; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 
    DECLARE varc1 INT DEFAULT 0; 
    DECLARE varc2 INT DEFAULT 0; 
    DECLARE varc3 INT DEFAULT 0; 
    OPEN cursor_i; 
    read_loop: LOOP 
    FETCH cursor_i INTO varc1, varc2, varc3; 
    IF done THEN 
     LEAVE read_loop; 
    END IF; 
    --queries which couldnt be made into set based queries go here--- 
    END LOOP; 
    CLOSE cursor_i; 
END; 

不要忘了 「結束」 您使用的程序和重置符

;; 
DELIMITER ; 

最後運行您的程序螺紋鋼

CALL ReeBAR(); 

(未測試的代碼)

+0

如果ID中存在不連續性(例如,執行DELETE時),這將不起作用。 – singe3

+0

@ singe3爲什麼id列中會出現不連續?它在這種情況下使用自動增量生成。對於想要將概念應用於已存在的表並且可能具有不連續的id列的用戶來說,這一點從來就不是那麼簡單。我已經編輯了答案以允許他們。 –

+0

感謝您的更新!實際上,如果使用數據庫的應用程序由於某種原因需要刪除一些舊條目,則可能會發生不連續性。 – singe3

相關問題