日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

django mysql 游标,MySQL Cursor 存储过程之游标与相关循环

發布時間:2024/9/27 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 存储过程之游标与相关循环的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。