Các khái niệm như “vòng lặp” (cho-mỗi, trong khi, v.v.) và “phân nhánh” (nếu-khác, cuộc gọi, v.v.) là thủ tục và không tồn tại trong khai báo ngôn ngữ như SQL. Thông thường người ta có thể diễn đạt kết quả mong muốn của một người theo cách khai báo, đó sẽ là cách chính xác để giải quyết vấn đề này.
Ví dụ:nếu testProc
thủ tục sẽ được gọi sử dụng id
đã cho làm khóa tra cứu vào một bảng khác, sau đó bạn có thể (và nên) thay vào đó chỉ cần JOIN
các bảng của bạn lại với nhau — ví dụ:
SELECT ...
FROM objects JOIN other USING (id)
WHERE ...
Thay vào đó, chỉ trong những tình huống cực kỳ hiếm gặp mà vấn đề của bạn không thể được diễn đạt một cách khai báo thì bạn mới nên sử dụng cách giải quyết vấn đề theo thủ tục. Đã lưu trữ thủ tục là cách duy nhất để thực thi mã thủ tục trong MySQL. Vì vậy, bạn cần phải sửa đổi mầm hiện có của mình để nó thực hiện logic hiện tại trong một vòng lặp hoặc nếu không, hãy tạo một mầm mới gọi cái hiện có của bạn từ trong một vòng lặp:
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