django mysql 游标,MySQL Cursor 存储过程之游标与相关循环
簡單介紹游標
在檢索出來的行中,前進或者后退一行或多行,就需要用到所謂的“游標”。
游標不是某個SELECT語句,但是它是被該語句檢索出來的結果集。
幾個特點:
·MySQL游標只能用于存儲過程(和函數)。
·游標是不能滾動的,也就是只能在一個方向上進行遍歷,不能在記錄之間隨意進退,不能跳過某些記錄。
使用步驟
1. 用DECLARE語句聲明一個游標。
在能夠使用游標前,必須聲明(定義)它。定義要使用的select語句。
DECLARE cursor_name CURSOR FOR SELECT_statement;
2.?使用OPEN語句來打開上面你定義的游標。
一旦聲明后,必須打開游標以提供使用。這個過程用前面定義的select語句把數據實際檢索出來。
OPEN cursor_name;
3.?用FETCH語句來獲得下一行數據。
FETCH是從第一行開始,獲取當前行的數據,每次執行后會移動內部行指針,再次調用FETCH則會檢索到下一行(不會重復讀取同一行)。
FETCH cursor_name INTO variable list;
注意,尤其在循環中不要忘記用Fetch取下一行。
4.?在結束游標使用時,必須關閉游標。
在OPEN時才執行查詢,存儲檢索出的數據以供瀏覽和滾動。在游標使用完成后,使用CLOSE進行關閉。
CLOSE cursor_name;
在WHILE循環中的使用游標
WHILE語法構造:
while 布爾表達式 do
語句序列;
end while
下面是游標與WHILE循環一起使用的例子。
示例中的 表cur_test1,?表cur_test2結構相同,如下。
(用了與mysql自帶的 sakila.country 相同的結構,且往cur_test1 insert了sakila.country的數據:
INSERT INTO cur_test1 SELECT * FROM sakila.country;??)
Create Table: CREATE TABLE `cur_test1` (
`country_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`country` varchar(50) NOT NULL,
`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`country_id`)
) ENGINE=InnoDB AUTO_INCREMENT=110 DEFAULT CHARSET=utf8
這個例子是把 表cur_test1 中的相應數據copy到 表cur_test2中。
(注意這里僅關注游標cursor與循環的用法)
其他在以下存儲過程的SQL的注釋中進行了解釋。
DELIMITER //
DROP PROCEDURE IF EXISTS cur_while_test;
CREATE PROCEDURE cur_while_test()
BEGIN
DECLARE done int;
DECLARE x_country_id smallint(5);
DECLARE x_country varchar(50);
DECLARE x_last_update timestamp;
/*First: Delcare a cursor,首先這里對游標進行定義*/
DECLARE cur1 CURSOR FOR
SELECT
country_id,
country,
last_update
FROM cur_test1
ORDER BY country_id;
/*when "not found" occur,just continue,這個是個條件處理,針對NOT FOUND的條件*/
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
/*本例適用,本例是insert語句,為可多次執行本存儲過程準備的語句*/
TRUNCATE TABLE cur_test2;
SET done = 0;
/*Second: Open the cursor 接著使用OPEN打開游標*/
OPEN cur1;
/*Third: now you can Fetch the row 把第一行數據寫入變量中,游標也隨之指向了記錄的第一行*/
FETCH cur1 INTO x_country_id,
x_country,
x_last_update;
WHILE done = 0 DO
INSERT INTO cur_test2(
country_id,
country,
last_update
)
VALUES(
x_country_id,
x_country,
x_last_update
);
/*抓下一行數據,否則 WHILE done=0 這個條件永遠成立,變成無限插入第一行數據的死循環*/
FETCH cur1 INTO x_country_id,
x_country,
x_last_update;
END WHILE;
/*Finally: cursor need be closed 用完后記得用CLOSE把資源釋放掉*/
CLOSE cur1;
END
在REPEAT循環中的使用游標
REPEAT語法構造:
repeat
語句序列;
util 布爾表達式
end repeat
下面是游標與REPEAT循環一起使用的例子。
與上面while循環的例子相同,這個例子是把 表cur_test1 中的相應數據copy到 表cur_test2中。
(注意這里僅關注游標cursor與循環的用法)
其他在以下存儲過程的SQL的注釋中進行了解釋。
DELIMITER //
DROP PROCEDURE IF EXISTS cur_repeat_test;
CREATE PROCEDURE cur_repeat_test()
BEGIN
DECLARE done int;
DECLARE x_country_id smallint(5);
DECLARE x_country varchar(50);
DECLARE x_last_update timestamp;
/*First: Delcare a cursor,首先這里對游標進行定義*/
DECLARE cur1 CURSOR FOR
SELECT
country_id,
country,
last_update
FROM cur_test1
ORDER BY country_id;
/*when "not found" occur,just continue,這個是個條件處理,針對NOT FOUND的條件*/
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
/*本例適用,本例是insert語句,為可多次執行本存儲過程準備的語句*/
TRUNCATE TABLE cur_test2;
SET done = 0;
/*Second: Open the cursor 接著使用OPEN打開游標*/
OPEN cur1;
/*Third: now you can Fetch the row 把第一行數據寫入變量中,游標也隨之指向了記錄的第一行*/
FETCH cur1 INTO x_country_id,
x_country,
x_last_update;
REPEAT
INSERT INTO cur_test2(
country_id,
country,
last_update
)
VALUES(
x_country_id,
x_country,
x_last_update
);
/*不要忘了抓下一行數據*/
FETCH cur1 INTO x_country_id,
x_country,
x_last_update;
UNTIL done = 1
END REPEAT;
/*Finally: cursor need be closed 用完后記得用CLOSE把資源釋放掉*/
CLOSE cur1;
END
總結
以上是生活随笔為你收集整理的django mysql 游标,MySQL Cursor 存储过程之游标与相关循环的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 绿盟科技鸿蒙系统,华为 X 绿盟科技,打
- 下一篇: 投票选举 算法_区块链主流共识算法一文全