Việc sử dụng con trỏ yêu cầu một số mã soạn sẵn tiêu chuẩn để bao quanh nó.
Việc sử dụng con trỏ để gọi một thủ tục được lưu trữ cho từng bộ giá trị từ bảng yêu cầu về cơ bản giống nhau. Bạn SELECT
các giá trị bạn muốn chuyển, từ bất kỳ nơi nào bạn đang nhận chúng (có thể là bảng tạm thời, bảng cơ sở hoặc dạng xem và có thể bao gồm các lệnh gọi đến các hàm được lưu trữ) và sau đó gọi thủ tục với các giá trị đó.
Tôi đã viết một ví dụ hợp lệ về mặt cú pháp của mã soạn sẵn đó, bên dưới, với các nhận xét để giải thích mỗi thành phần đang làm gì. Có vài điều tôi không thích hơn là được yêu cầu chỉ làm điều gì đó "chỉ vì" - vì vậy mọi thứ đều được giải thích (hy vọng).
Bạn đã đề cập đến việc gọi thủ tục với nhiều giá trị, vì vậy ví dụ này sử dụng 2.
Lưu ý rằng có những sự kiện xảy ra cô ấy theo một thứ tự cụ thể là có lý do. Các biến phải được khai báo trước, con trỏ phải được khai báo trước khi tiếp tục xử lý và các vòng lặp phải tuân theo tất cả những điều đó. Điều này tạo ra ấn tượng rằng có một số sự thiếu linh hoạt khá nghiêm trọng, ở đây, nhưng thực sự không phải vậy. Bạn có thể đặt lại thứ tự bằng cách lồng mã bổ sung vào bên trong BEGIN
... END
khối trong cơ quan thủ tục; ví dụ:nếu bạn cần con trỏ thứ hai bên trong vòng lặp, bạn chỉ cần khai báo nó bên trong vòng lặp, bên trong một BEGIN
khác ... END
.
DELIMITER $$
DROP PROCEDURE IF EXISTS `my_proc` $$
CREATE PROCEDURE `my_proc`(arg1 INT) -- 1 input argument; you might not need one
BEGIN
-- from http://stackoverflow.com/questions/35858541/call-a-stored-procedure-from-the-declare-statement-when-using-cursors-in-mysql
-- declare the program variables where we'll hold the values we're sending into the procedure;
-- declare as many of them as there are input arguments to the second procedure,
-- with appropriate data types.
DECLARE val1 INT DEFAULT NULL;
DECLARE val2 INT DEFAULT NULL;
-- we need a boolean variable to tell us when the cursor is out of data
DECLARE done TINYINT DEFAULT FALSE;
-- declare a cursor to select the desired columns from the desired source table1
-- the input argument (which you might or might not need) is used in this example for row selection
DECLARE cursor1 -- cursor1 is an arbitrary label, an identifier for the cursor
CURSOR FOR
SELECT t1.c1,
t1.c2
FROM table1 t1
WHERE c3 = arg1;
-- this fancy spacing is of course not required; all of this could go on the same line.
-- a cursor that runs out of data throws an exception; we need to catch this.
-- when the NOT FOUND condition fires, "done" -- which defaults to FALSE -- will be set to true,
-- and since this is a CONTINUE handler, execution continues with the next statement.
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- open the cursor
OPEN cursor1;
my_loop: -- loops have to have an arbitrary label; it's used to leave the loop
LOOP
-- read the values from the next row that is available in the cursor
FETCH NEXT FROM cursor1 INTO val1, val2;
IF done THEN -- this will be true when we are out of rows to read, so we go to the statement after END LOOP.
LEAVE my_loop;
ELSE -- val1 and val2 will be the next values from c1 and c2 in table t1,
-- so now we call the procedure with them for this "row"
CALL the_other_procedure(val1,val2);
-- maybe do more stuff here
END IF;
END LOOP;
-- execution continues here when LEAVE my_loop is encountered;
-- you might have more things you want to do here
END $$
DELIMITER ;