Konsep seperti "loop" (untuk masing-masing, while, dll) dan "branching" (if-else, call, dll) adalah prosedural dan tidak ada di deklaratif bahasa seperti SQL. Biasanya seseorang dapat mengungkapkan hasil yang diinginkan dengan cara deklaratif, yang akan menjadi cara yang tepat untuk menyelesaikan masalah ini.
Misalnya, jika testProc
prosedur yang akan dipanggil menggunakan id
yang diberikan sebagai kunci pencarian ke tabel lain, maka Anda dapat (dan seharusnya) sebagai gantinya cukup JOIN
tabel Anda bersama-sama—misalnya:
SELECT ...
FROM objects JOIN other USING (id)
WHERE ...
Hanya dalam situasi yang sangat jarang di mana masalah Anda tidak dapat diungkapkan secara deklaratif, Anda harus menggunakan pemecahannya secara prosedural. prosedur yang tersimpan adalah satu-satunya cara untuk mengeksekusi kode prosedural di MySQL. Jadi, Anda perlu memodifikasi sproc yang ada sehingga menjalankan logika saat ini dalam satu lingkaran, atau membuat sproc baru yang memanggil yang sudah ada dari dalam satu lingkaran:
CREATE PROCEDURE foo() BEGIN
DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE _id BIGINT UNSIGNED;
DECLARE cur CURSOR FOR SELECT id FROM objects WHERE ...;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done := TRUE;
OPEN cur;
testLoop: LOOP
FETCH cur INTO _id;
IF done THEN
LEAVE testLoop;
END IF;
CALL testProc(_id);
END LOOP testLoop;
CLOSE cur;
END