背景
在Mysql中使用存儲過程。由於循環的過程中需要使用到字符,按照一些字符來循環,沒有找到好的辦法來循環字符。
所以考慮了游標來循環。
游標的好處是可以選擇多個條件來循環,不限制字符還是或者沒有順序的東西。
實現
CREATE PROCEDURE CALSOMETHING(IN ROUND_CNT INT)
BEGIN DECLARE I INT;DECLARE pin_value varchar(20); DECLARE pin_cur CURSOR for select pin from prnodes; /*這個表里面記錄着需要循環的數據,不連續,為字符*/ DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET PIN_VALUE = NULL;/*此處用於如果游標取值為空的時候就將pin_value置為NULL,防止錯誤*/ SET i= 1; while i <= ROUND_CNT DO open pin_cur; FETCH pin_cur into pin_value; while (pin_value is not null) DO /*此處做是否能取到值的判斷。不能則結束循環*/ insert into PageRank SELECT pin_value FROM DUAL;FETCH pin_cur into pin_value; end while; close pin_cur; set i=i+1; commit; end while; end;
備注
1.DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET PIN_VALUE = NULL;
與
DECLARE CONTINUE HANDLER FOR NOT FOUND SET FINISHED = 1;這種語法是一致的。
即:SQLSTATE '02000' = NOT FOUND
過程執行中用此處的條件來進行判斷是否取值結束。
2.SQLSTATE為代碼執行的狀態:
02000 發生下述異常之一:
SELECT INTO 語句或 INSERT 語句的子查詢的結果為空表。
在搜索的 UPDATE 或 DELETE 語句內標識的行數為零。
在 FETCH 語句中引用的游標位置處於結果表最后一行之后。
