时间:2021-07-01 10:21:17 帮助过:3人阅读
The cursor declaration must be after any variable declaration. If you declare a cursor before variables declaration, MySQL will issue an error. A cursor must always be associated with aSELECT
statement.
Next, you open the cursor by using the OPEN
statement. The OPEN
statement initializes the result set for the cursor, therefore, you must call the OPEN
statement before fetching rows from the result set.
1 | OPEN cursor_name; |
Then, you use the FETCH
statement to retrieve the next row pointed by the cursor and move the cursor to the next row in the result set.
1 | FETCH cursor_name INTO variables list; |
After that, you can check to see if there is any row available before fetching it.
Finally, you call the CLOSE
statement to deactivate the cursor and release the memory associated with it as follows:
1 | CLOSE cursor_name; |
When the cursor is no longer used, you should close it.
When working with MySQL cursor, you must also declare a NOT FOUND
handler to handle the situation when the cursor could not find any row. Because each time you call the FETCH
statement, the cursor attempts to read the next row in the result set. When the cursor reaches the end of the result set, it will not be able to get the data, and a condition is raised. The handler is used to handle this condition.
To declare a NOT FOUND
handler, you use the following syntax:
1 | DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1; |
Where finished
is a variable to indicate that the cursor has reached the end of the result set. Notice that the handler declaration must appear after variable and cursor declaration inside the stored procedures.
The following diagram illustrates how MySQL cursor works.
We are going to develop a stored procedure that builds an email list of all employees in theemployees
table in the MySQL sample database.
First, we declare some variables, a cursor for looping over the emails of employees, and a NOT FOUND
handler:
1 2 3 4 5 6 7 8 9 10 | DECLARE finished INTEGER DEFAULT 0; DECLARE email varchar(255) DEFAULT ""; -- declare cursor for employee email DEClARE email_cursor CURSOR FOR SELECT email FROM employees; -- declare NOT FOUND handler DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1; |
Next, we open the email_cursor
by using the OPEN
statement:
1 | OPEN email_cursor; |
Then, we iterate the email list, and concatenate all emails where each email is separated by a semicolon(;):
1 2 3 4 5 6 7 8 | get_email: LOOP FETCH email_cursor INTO v_email; IF v_finished = 1 THEN LEAVE get_email; END IF; -- build email list SET email_list = CONCAT(v_email,";",email_list); END LOOP get_email; |
After that, inside the loop we used the v_finished
variable to check if there is any email in the list to terminate the loop.
Finally, we close the cursor using the CLOSE
statement:
1 | CLOSE email_cursor; |
The build_email_list
stored procedure is as follows:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | DELIMITER $$ CREATE PROCEDURE build_email_list (INOUT email_list varchar(4000)) BEGIN DECLARE v_finished INTEGER DEFAULT 0; DECLARE v_email varchar(100) DEFAULT ""; -- declare cursor for employee email DEClARE email_cursor CURSOR FOR SELECT email FROM employees; -- declare NOT FOUND handler DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1; OPEN email_cursor; get_email: LOOP FETCH email_cursor INTO v_email; IF v_finished = 1 THEN LEAVE get_email; END IF; -- build email list SET email_list = CONCAT(v_email,";",email_list); END LOOP get_email; CLOSE email_cursor; END$$ DELIMITER ; |
You can test the build_email_list
stored procedure using the following script:
1 2 3 | SET @email_list = ""; CALL build_email_list(@email_list); SELECT @email_list; |
In this tutorial, we have shown you how to use MySQL cursor to iterate a result set and process each row accordingly.
MySQL Cursor
标签: