什么是游標(biāo)?
游標(biāo)(cursor)是一個(gè)存儲(chǔ)在MySQL服務(wù)器上的數(shù)據(jù)庫(kù)查詢(xún), 它不是一條SELECT語(yǔ)句,而是被該語(yǔ)句檢索出來(lái)的結(jié)果集。在存儲(chǔ)了游 標(biāo)之后,應(yīng)用程序可以根據(jù)需要滾動(dòng)或?yàn)g覽其中的數(shù)據(jù)。
注意:MySQL游標(biāo)只能用于 存儲(chǔ)過(guò)程(和函數(shù))。
創(chuàng)建游標(biāo)
在創(chuàng)建一個(gè)游標(biāo)前,我們需要先清除游標(biāo)的語(yǔ)法
1、定義游標(biāo)
- DECLARE 游標(biāo)名稱(chēng) CURSOR FOR SQL語(yǔ)句;
2、打開(kāi)游標(biāo)
- OPEN 游標(biāo)名稱(chēng);
3、獲取結(jié)果
- FETCH 游標(biāo)名稱(chēng) INTO 變量名稱(chēng)[,變量名稱(chēng)];
4、關(guān)閉游標(biāo)
- CLOSE 游標(biāo)名稱(chēng);
我們以Customers表來(lái)作為示例
示例一
定義一個(gè)存儲(chǔ)過(guò)程,調(diào)用的時(shí)候執(zhí)行里面的游標(biāo)
- CREATE PROCEDURE PROC1()
- BEGIN
- -- 定義兩個(gè)存放結(jié)果的變量
- DECLARE NAME VARCHAR(20);
- DECLARE ADDR VARCHAR(50);
- -- 聲明游標(biāo)
- DECLARE MY CURSOR FOR SELECT 姓名,地址 FROM customers;
- -- 打開(kāi)游標(biāo)
- OPEN MY;
- -- 獲取結(jié)果
- FETCH MY INTO NAME,ADDR;
- -- 這里是為了顯示獲取結(jié)果
- SELECT NAME,ADDR;
- -- 關(guān)閉游標(biāo)
- CLOSE MY;
- END;
我們執(zhí)行完上面的存儲(chǔ)過(guò)程后,就可以調(diào)用該存儲(chǔ)過(guò)程了
- CALL PROC1();
得到結(jié)果:
這里肯定有小伙伴好奇,customers表里明明有7條記錄,為什么只顯示了1條記錄?
這是因?yàn)橛螛?biāo)的變量只保留了customers表中的第一行數(shù)據(jù),如果要查看后面的數(shù)據(jù),就需要循環(huán)往下移動(dòng)游標(biāo),才能繼續(xù)查看。
示例二
定義一個(gè)存儲(chǔ)過(guò)程,調(diào)用存儲(chǔ)過(guò)程時(shí),將表customers里的數(shù)據(jù)循環(huán)寫(xiě)入新的表里面。
- CREATE PROCEDURE PROC2()
- BEGIN
- -- 定義兩個(gè)存放結(jié)果的變量
- DECLARE FLAG INT DEFAULT 0;
- DECLARE NAME VARCHAR(20);
- DECLARE ADDR VARCHAR(50);
- -- 聲明游標(biāo)
- DECLARE MY CURSOR FOR SELECT 姓名,地址 FROM customers;
- DECLARE CONTINUE HANDLER FOR NOT FOUND SET FLAG=1;
- -- 打開(kāi)游標(biāo)
- OPEN MY;
- -- 循環(huán)體部分
- L1:LOOP
- -- 獲取結(jié)果
- FETCH MY INTO NAME,ADDR;
- IF FLAG=1 THEN
- LEAVE L1;
- END IF;
- -- 這里是為了顯示獲取結(jié)果
- INSERT INTO cus VALUES(NAME,ADDR);
- -- 關(guān)閉游標(biāo)
- END LOOP; -- 結(jié)束循環(huán)
- CLOSE MY;
- END;
然后我們執(zhí)行這個(gè)存儲(chǔ)過(guò)程,并查詢(xún)cus表里的數(shù)據(jù)
- CALL PROC2();
- SELECT * FROM cus;
結(jié)果:
結(jié)果與customers里的一致,但是這些結(jié)果是循環(huán)一條一條往下移動(dòng)的過(guò)程中插入的,即這個(gè)循環(huán)執(zhí)行了7次。
以上就是游標(biāo)的基本操作原理了,此外游標(biāo)的循環(huán)體還有WHILE,REPEAT等操作方式,他們的操作方式與LOOP類(lèi)似,都是用來(lái)循環(huán)執(zhí)行循環(huán)體里面的內(nèi)容,直到循環(huán)結(jié)束。
原文鏈接:https://mp.weixin.qq.com/s/ywVDU0G2GCijxeof5FB1JQ