যেহেতু একটি লুপের পরামর্শটি কোনও পদ্ধতির ধরণের সমাধানের অনুরোধকে বোঝায়। আমারটা এখানে.
টেবিল থেকে নেওয়া যে কোনও একক রেকর্ডে কাজ করে এমন যে কোনও ক্যোয়ারী এটিকে টেবিলের প্রতিটি সারি পেরিয়ে চালানোর জন্য কোনও পদ্ধতিতে মোড়ানো হতে পারে:
DROP PROCEDURE IF EXISTS ROWPERROW;
DELIMITER ;;
তারপরে আপনার উদাহরণ অনুসারে পদ্ধতিটি এখানে রয়েছে (টেবিল_এ এবং টেবিল_বি স্পষ্টতার জন্য ব্যবহৃত)
CREATE PROCEDURE ROWPERROW()
BEGIN
DECLARE n INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
SELECT COUNT(*) FROM table_A INTO n;
SET i=0;
WHILE i<n DO
INSERT INTO table_B(ID, VAL) SELECT (ID, VAL) FROM table_A LIMIT i,1;
SET i = i + 1;
END WHILE;
End;
;;
তারপরে ডিলিমিটারটি পুনরায় সেট করতে ভুলবেন না
DELIMITER ;
এবং নতুন পদ্ধতি চালান
CALL ROWPERROW();
আপনার "অনুরোধ INTO" লাইনে আপনি যা খুশি তা করতে পারেন যা আমি আপনার উদাহরণ অনুরোধ থেকে কেবল অনুলিপি করেছি।
সাবধানে নোট করুন যে এখানে ব্যবহৃত "INSERT INTO" লাইনটি প্রশ্নের রেখাটি আয়না করে। এই উত্তরের মতামত অনুসারে আপনাকে নিশ্চিত করতে হবে যে আপনার এসকিউএল এর যে সংস্করণটি চলছে তার জন্য আপনার প্রশ্নটি সিনট্যাক্টিক্যালি সঠিক কিনা is
সাধারণ ক্ষেত্রে যেখানে আপনার আইডি ক্ষেত্রটি বাড়ানো হয় এবং 1 থেকে শুরু হয় উদাহরণের লাইনটি হতে পারে:
INSERT INTO table_B(ID, VAL) VALUES(ID, VAL) FROM table_A WHERE ID=i;
"নির্বাচন COUNT" লাইনটি এর সাথে প্রতিস্থাপন করা হচ্ছে
SET n=10;
কেবলমাত্র টেবিল_এ-তে প্রথম 10 রেকর্ডে আপনার ক্যোয়ারিকে পরীক্ষা করতে দেবে।
গত এক জিনিস. এই প্রক্রিয়াটি বিভিন্ন টেবিল জুড়ে বাসা বাঁধার পক্ষে খুব সহজ এবং আমি এক টেবিলে এমন কোনও প্রক্রিয়া চালিয়ে যেতে পারি যা অভিভাবক সারণীর প্রতিটি সারি থেকে একটি নতুন টেবিলের মধ্যে বিভিন্ন সংখ্যক রেকর্ডকে গতিশীলভাবে sertedোকানো হয়েছিল।
আপনার যদি দ্রুত চালনার প্রয়োজন হয় তবে অবশ্যই এটি ভিত্তিক সেট করার চেষ্টা করুন, যদি না হয় তবে এটি ঠিক আছে। আপনি উপরের কার্সার আকারে আবারও লিখতে পারেন তবে এটি কার্য সম্পাদন করতে পারে না। যেমন:
DROP PROCEDURE IF EXISTS cursor_ROWPERROW;
DELIMITER ;;
CREATE PROCEDURE cursor_ROWPERROW()
BEGIN
DECLARE cursor_ID INT;
DECLARE cursor_VAL VARCHAR;
DECLARE done INT DEFAULT FALSE;
DECLARE cursor_i CURSOR FOR SELECT ID,VAL FROM table_A;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cursor_i;
read_loop: LOOP
FETCH cursor_i INTO cursor_ID, cursor_VAL;
IF done THEN
LEAVE read_loop;
END IF;
INSERT INTO table_B(ID, VAL) VALUES(cursor_ID, cursor_VAL);
END LOOP;
CLOSE cursor_i;
END;
;;
ভেরিয়েবলগুলি ঘোষণার কথা মনে রাখবেন আপনি কোয়েরি সারণীগুলির মতো একই ধরণের হিসাবে ব্যবহার করবেন।
আমার পরামর্শ হ'ল আপনি যখন পারেন তখন সেটবেসড কোয়েরিগুলি সহ যান এবং আপনার যদি প্রয়োজন হয় তবে কেবল সাধারণ লুপ বা কার্সার ব্যবহার করুন।