টেবিলের সব রো লুপ করতে MySQL-এ স্টোয়ারড প্রোসিজার ব্যবহার করতে হয়। সিনট্যাক্স:
DELIMITER //
CREATE PROCEDURE yourProcedureName()
BEGIN
DECLARE anyVariableName1 INT DEFAULT 0;
DECLARE anyVariableName2 INT DEFAULT 0;
SELECT COUNT(*) FROM yourTableName1 INTO anyVariableName1;
SET anyVariableName2 = 0;
WHILE anyVariableName2 < anyVariableName1 DO
INSERT INTO yourTableName2(yourColumnName,...N)
SELECT (yourColumnName1,...N) FROM yourTableName1 LIMIT anyVariableName2,1;
SET anyVariableName2 = anyVariableName2 + 1;
END WHILE;
END; //
DELIMITER ;
সিনট্যাক্স বুঝতে দুটি টেবিল তৈরি করি। প্রথম টেবিলে রেকর্ড থাকবে এবং দ্বিতীয় টেবিলে স্টোয়ারড প্রোসিজার দিয়ে লুপ করে রেকর্ড কপি হবে।
প্রথম টেবিল তৈরির ক্যোয়ারি:
mysql> CREATE TABLE AllRows (
-> Id INT,
-> Name VARCHAR(100)
-> ); Query OK, 0 rows affected (0.46 sec)
প্রথম টেবিলে কিছু রেকর্ড ইনসার্ট করি:
mysql> INSERT INTO AllRows VALUES(1,'John'); Query OK, 1 row affected (0.12 sec) mysql> INSERT INTO AllRows VALUES(100,'Carol'); Query OK, 1 row affected (0.13 sec) mysql> INSERT INTO AllRows VALUES(300,'Sam'); Query OK, 1 row affected (0.15 sec) mysql> INSERT INTO AllRows VALUES(400,'Mike'); Query OK, 1 row affected (0.20 sec)
সিলেক্ট স্টেটমেন্ট দিয়ে সব রেকর্ড দেখি:
mysql> SELECT * FROM AllRows;
আউটপুট
+------+-------+ | Id | Name | +------+-------+ | 1 | John | | 100 | Carol | | 300 | Sam | | 400 | Mike | +------+-------+ 4 rows in set (0.00 sec)
দ্বিতীয় টেবিল তৈরির ক্যোয়ারি:
mysql> CREATE TABLE SecondTableRows (
-> StudentId INT,
-> StudentName VARCHAR(100)
-> ); Query OK, 0 rows affected (0.54 sec)
স্টোয়ারড প্রোসিজার ব্যবহার করে প্রথম টেবিলের সব রো লুপ করার কোড:
mysql> DELIMITER //
mysql> CREATE PROCEDURE Sp_AllRowsOfATable()
-> BEGIN
-> DECLARE lastRows INT DEFAULT 0;
-> DECLARE startRows INT DEFAULT 0;
-> SELECT COUNT(*) FROM AllRows INTO lastRows;
-> SET startRows = 0;
-> WHILE startRows < lastRows DO
-> INSERT INTO SecondTableRows(StudentId) SELECT (Id) FROM AllRows LIMIT startRows, 1;
-> SET startRows = startRows + 1;
-> END WHILE;
-> END;
-> //
Query OK, 0 rows affected (0.22 sec)
mysql> DELIMITER ;
CALL কমান্ড দিয়ে স্টোয়ারড প্রোসিজার কল করি:
CALL yourStoredProcedureName;
উপরের স্টোয়ারড প্রোসিজার কল করে প্রথম টেবিলের সব রো লুপ করি:
mysql> CALL Sp_AllRowsOfATable(); Query OK, 1 row affected (0.61 sec)
স্টোয়ারড প্রোসিজার কল করার পর দ্বিতীয় টেবিলে কী হয়েছে তা চেক করি:
mysql> SELECT StudentId FROM SecondTableRows;
আউটপুট
+-----------+ | StudentId | +-----------+ | 1 | | 100 | | 300 | | 400 | +-----------+ 4 rows in set (0.00 sec)