あなたが求めていることは、あなたが知っているように、ほとんどの問題に対して特に非効率的な解決策です. ただし、あなたが具体的にそれを要求したため、そして(非常にまれに)それが問題を解決する唯一の方法である(またはあなたが個人的にそれを解決する方法を理解する唯一の方法である)ためです. あなたが尋ねることを行う方法は次のとおりです。
t1 テーブルを作成します。例:
CREATE TABLE t1(id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, C1 INT, C2 INT, C3 INT);
記述した SELECT を実行します。
INSERT INTO t1 SELECT NULL,c1,c2,c3 FROM the_table;
Row-By-Agonising-Row "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 列が連続していない場合は、次のカーソル形式を使用できます。
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 ;
最後に ReBAR 手順を実行します
CALL ReeBAR();
(コードは未テスト)