本文目錄一覽:
mysql里怎樣循環遍歷游標
–傳入id,輸出name和sex的存儲過程,這裡同個id有多條數據,所以需要用到游標。
DELIMITER //
CREATE PROCEDURE p5(IN v_id INT)
BEGIN
DECLARE nodata INT DEFAULT 0;#注意:這個變量聲明必須放在游標聲明前面
DECLARE v_name VARCHAR(30);
DECLARE v_sex CHAR(3);
DECLARE c_ns CURSOR FOR SELECT NAME,sex FROM t WHERE id = v_id;
DECLARE EXIT HANDLER FOR NOT FOUND SET nodata = 1;#當讀到數據的最後一條時,設置變量為1
OPEN c_ns;
WHILE nodata = 0 DO#判斷是不是到了最後一條數據
FETCH c_ns INTO v_name,v_sex;
SELECT v_name,v_sex,nodata;
END WHILE;
CLOSE c_ns;
END
//
–執行該存儲過程
mysql call p5(2);
+——–+——-+——–+
| v_name | v_sex | nodata |
+——–+——-+——–+
| song | 女 | 0 |
+——–+——-+——–+
1 row in set (0.04 sec)
+——–+——-+——–+
| v_name | v_sex | nodata |
+——–+——-+——–+
| dan | 男 | 0 |
+——–+——-+——–+
1 row in set (0.05 sec)
Query OK, 0 rows affected, 1 warning (0.05 sec)
–注意:CONTINUE 會繼續當前的block 中的語句, 它在set done=1 後繼續執行下一個語句。EXIT 則在 set done=1 後離開當前的語句塊
所以這裡用了EXIT(黃色陰影部分).
如果是continue,結果如下:
mysql call p5(2);
– //
+——–+——-+
| v_name | v_sex |
+——–+——-+
| song | 女 |
+——–+——-+
1 row in set (0.00 sec)
+——–+——-+
| v_name | v_sex |
+——–+——-+
| dan | 男 |
+——–+——-+
1 row in set (0.01 sec)
+——–+——-+
| v_name | v_sex |
+——–+——-+
| dan | 男 |
+——–+——-+
1 row in set (0.02 sec)
Query OK, 0 rows affected, 1 warning (0.03 sec)
mysql使用游標遍曆數據進行批量針對性更新數據,急求mysql大神解答
根據你的資料,正確的答案應該如下:望採納
CREATE DEFINER=`root`@`localhost` PROCEDURE `P_updateUd18`(`Param` int(11))
BEGIN
declare Rcount,i,j,k,Rparentid,myId int(11) default 0;
declare Robjname,Robjname23,Robjname45,Robjname67,Robjname89 varchar(9) default “”;
select count(id) into Rcount from ud18;
repeat
select id,objname into myId,Robjname from ud18 order by id limit i,1;
set Robjname23=SUBSTRING(Robjname,2,2);
set Robjname45=SUBSTRING(Robjname,4,2);
set Robjname67=SUBSTRING(Robjname,6,2);
set Robjname89=SUBSTRING(Robjname,8,2);
if Robjname890 then
set @sql=concat(“select id into @abc from ud18 where objname like ‘”,left(Robjname,7),”00″,”‘”);
prepare stmt from @sql;
EXECUTE stmt;
set Rparentid=@abc;
update ud18 set parentid=Rparentid where id=myId;
elseif Robjname670 then
set @sql=concat(“select id into @abc from ud18 where objname like ‘”,left(Robjname,5),”0000″,”‘”);
prepare stmt from @sql;
EXECUTE stmt;
set Rparentid=@abc;
update ud18 set parentid=Rparentid where id=myId;
elseif Robjname450 then
set @sql=concat(“select id into @abc from ud18 where objname like ‘”,left(Robjname,3),”000000″,”‘”);
prepare stmt from @sql;
EXECUTE stmt;
set Rparentid=@abc;
update ud18 set parentid=Rparentid where id=myId;
elseif Robjname230 then
— set @sql=concat(“select id into @abc from ud18 where objname like ‘”,left(Robjname,1),”00000000″,”‘”);
— prepare stmt from @sql;
— EXECUTE stmt;
— set Rparentid=@abc;
update ud18 set parentid=0 where id=myId;
else
set j=0;
end if;
set i=i+1;
until iRcount end repeat;
END;
MySQL 游標的定義與使用
從字面可以這麼理解什麼是游標,游標就像是水面上漂浮的一個標記,這個標記可以來回遊動,一會游到這裡一會游到那裡,這裡的河水可以理解為是數據的集合,這個標記就是在這些數據間來回遊動。
為什麼 MySQL 會有游標這個概念,由於 SQL 語言是面向集合的語句,它每次查詢出來都是一堆數據的集合,沒有辦法對其中一條記錄進行單獨的處理。如果要對每條記錄進行單獨處理就需要游標。
游標其實就像是編程語言中的 for/foreach 循環,把一個數組(數據的集合)中每條數據一條一條地循環出來,然後你在 for/foreach 循環中使用判斷語句對你感興趣的數據進行處理。
哪裡可以使用游標呢,函數,存儲過程,觸發器中都可以使用。
說完概念,就來看下游標的固定寫法。不管概念是否理解,記住下面的固定模式也可以完成搬磚任務。
1、聲明游標
SELECT 語句就是正常的查詢語句,例如:SELECT id,age FROM table;
2、打開游標
在打開游標之前,游標定義的 SQL 語句是不執行的。
3、取出記錄
將當前的記錄數據存入變量。
當 FETCH 沒有找到記錄時會拋出異常,異常的定義需要下面的 HANDLER FOR 語句。
聲明游標語句中的 SELECT 如果有多個字段,INTO 後面需要多個變量進行接收。
4、設置結束條件
這個語句的作用是指定一個條件,告訴程序所有數據已經循環完畢,可以結束了。由於游標是使用 WHILE 循環進行每條數據的讀取,就需要給 WHILE 一個結束條件。
處理種類:可以是, EXIT 立即結束。CONTINUE 繼續下面的處理。
異常的類型:一般指定為 NOT FOUND ,意思是沒有找到任何數據。
異常發生時的處理:當異常發生時需要做的事情,這裡一般改變一個變量的值來記錄異常已經發生了,如如 SET flat = 1 詳細用法查看下面的例子。
5、關閉游標
實戰代碼:
完畢,看懂沒,如果沒看懂沒關係,游標處理是一套固定的格式,按照上面例子中固定的格式套入到你的程序就可以了。
原創文章,作者:IEQZ,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/140660.html