游標(cursor)是一個存儲在MySQL服務器上的數據庫查詢, 它不是一條SELECT語句,而是被該語句檢索出來的結果集。在存儲了游 標之后,應用程序可以根據需要滾動或瀏覽其中的數據。
?什么是游標?
游標(cursor)是一個存儲在MySQL服務器上的數據庫查詢, 它不是一條SELECT語句,而是被該語句檢索出來的結果集。在存儲了游 標之后,應用程序可以根據需要滾動或瀏覽其中的數據。
注意:MySQL游標只能用于 存儲過程(和函數)。
創建游標
在創建一個游標前,我們需要先清除游標的語法
1、定義游標
DECLARE 游標名稱 CURSOR FOR SQL語句;
2、打開游標
OPEN 游標名稱;
3、獲取結果
FETCH 游標名稱 INTO 變量名稱[,變量名稱];
4、關閉游標
CLOSE 游標名稱;
我們以Customers表來作為示例

示例一
定義一個存儲過程,調用的時候執行里面的游標
CREATE PROCEDURE PROC1()
BEGIN
-- 定義兩個存放結果的變量
DECLARE NAME VARCHAR(20);
DECLARE ADDR VARCHAR(50);
-- 聲明游標
DECLARE MY CURSOR FOR SELECT 姓名,地址 FROM customers;
-- 打開游標
OPEN MY;
-- 獲取結果
FETCH MY INTO NAME,ADDR;
-- 這里是為了顯示獲取結果
SELECT NAME,ADDR;
-- 關閉游標
CLOSE MY;
END;
我們執行完上面的存儲過程后,就可以調用該存儲過程了
得到結果:

這里肯定有小伙伴好奇,customers表里明明有7條記錄,為什么只顯示了1條記錄?
這是因為游標的變量只保留了customers表中的第一行數據,如果要查看后面的數據,就需要循環往下移動游標,才能繼續查看。
示例二
定義一個存儲過程,調用存儲過程時,將表customers里的數據循環寫入新的表里面。
CREATE PROCEDURE PROC2()
BEGIN
-- 定義兩個存放結果的變量
DECLARE FLAG INT DEFAULT 0;
DECLARE NAME VARCHAR(20);
DECLARE ADDR VARCHAR(50);
-- 聲明游標
DECLARE MY CURSOR FOR SELECT 姓名,地址 FROM customers;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET FLAG=1;
-- 打開游標
OPEN MY;
-- 循環體部分
L1:LOOP
-- 獲取結果
FETCH MY INTO NAME,ADDR;
IF FLAG=1 THEN
LEAVE L1;
END IF;
-- 這里是為了顯示獲取結果
INSERT INTO cus VALUES(NAME,ADDR);
-- 關閉游標
END LOOP; -- 結束循環
CLOSE MY;
END;
然后我們執行這個存儲過程,并查詢cus表里的數據
CALL PROC2();
SELECT * FROM cus;
結果:

結果與customers里的一致,但是這些結果是循環一條一條往下移動的過程中插入的,即這個循環執行了7次。
以上就是游標的基本操作原理了,此外游標的循環體還有WHILE,REPEAT等操作方式,他們的操作方式與LOOP類似,都是用來循環執行循環體里面的內容,直到循環結束。?