如你所知,你所要求的是對大多數問題的解決方案效率特別低。然而,既然你特意要求了它,而且(因爲偶爾)它是解決問題的唯一方法(或者你本人有時間弄清楚如何解決問題的唯一方法)。這裏是你會如何做什麼你問:
創建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();
(未測試的代碼)
MySQL文檔是如此糟糕,以至於它的鏈接很少有幫助。 – glyph