MySQL游標的簡單實踐

2021-09-08 04:39:58 字數 3738 閱讀 7313

q:為什麼要使用游標?a:

在儲存過程(或函式)中,如果某條select語句返回的結果集中只有1行,可以使用select into語句(上幾篇部落格有介紹到用法)來得到該行進行處理;如果結果集中有多行,簡單的select語句成批地進行處理,需要在檢索出來的行中前進或後退一行或多行……若是想得到其中的每一行進行處理,就必須使用游標。

q:什麼是游標?a:

游標(cursor),

是乙個儲存在mysql伺服器上的資料庫查詢,游標不是一條 select語句,而是被該語句檢索出來的結果集;

可以看做是指向查詢結果集的指標;

通過cursor,就可以一次一行的從結果集中把行拿出來處理。

注意:mysql游標只能用於儲存過程和函式。

游標的處理過程:4步

①宣告游標declare:沒有檢索資料,只是定義要使用的select語句

②開啟游標open:開啟游標以供使用,用上一步定義的select語句把資料實際檢索出來

③檢索游標fetch:對於填有資料的游標,根據需要取出(檢索)各行

④關閉游標close:在結束游標使用時,必須關閉游標

1、宣告游標

declare cursor_name cursor for select_statement;

宣告乙個游標cursor_name,讓其指向查詢select_statement的結果集。

注意:①游標宣告必須出現在變數和條件宣告的後面,但是在異常處理宣告的前面

②乙個過程中可以有多個游標宣告

2、開啟游標

open cursor_name;

cursor_name是宣告中定義的名字;

開啟游標時才執行相應的select_statement。

3、檢索游標

fetch  cursor_name into var_name [, var_name] ...

從游標cursor_name中拿出一行,把該行的各個列值儲存到各個變數中。

解析:一次只拿一行,拿完後,自動移動指標到下一行;

如果沒有拿到行,會丟擲異常,其sqlstate**值為『02000』,此時要檢測到該情況,需要宣告異常處理程式 (針對條件not found也可以),通常需要在乙個迴圈中來執行fetch語句,通過檢測以上異常來結束迴圈。

4、關閉游標

close cursor_name;

收回游標占用的記憶體,別浪費資源嘛。

例1:建立過程,計算players表中行的數量

mysql>delimiter $$

mysql>create procedure number_of_players(

->   out pnumber int

) ->begin

->   declare a_playerno int

; ->   declare found bool

default

true

;  迴圈控制變數,其值為false時迴圈結束

->

->   declare c_players cursor for

->     select playerno from

players; ①宣告游標

->

->   declare continue handler for

not found

->     set found=false

; 宣告異常處理程式

->

->   set pnumber=0

; ->

->open c_players; ②開啟游標

->

->fetch c_players into a_playerno; ③檢索游標(檢索第一行)

->   while found do

->     set pnumber=pnumber+1

; ->fetch c_players into a_playerno;

->   end while

; 迴圈檢索其餘行

->

->close c_players; ④關閉游標

->end

$$mysql>delimiter ;

mysql>call number_of_players(@pnumber);

mysql> select

@pnumber;

+----------+

| @pnumber |

+----------+

| 14 |

+----------+mysql> select count(*) from

players;

+----------+

| count(*) |

+----------+

| 14 |

+----------+

例2:建立過程,計算某個球員的罰款次數--游標宣告中可以包含變數

mysql>delimiter $$

mysql>create procedure number_penalties(

->   in p_playerno int

, ->   out pnumber int

) ->begin

->   declare a_playerno int

; ->   declare found bool

default

true

; 迴圈控制變數

->

->   declare c_players cursor for

宣告游標

->     select

playerno

->     from

penalties

->     where playerno =p_playerno; 包含變數p_playerno

->

->   declare continue handler for

not found

->     set found=false

; 宣告異常處理程式

->

->   set pnumber=0

; ->

->open c_players; 開啟游標

->

->fetch c_players into a_playerno;

->   while found do

迴圈檢索游標每一行

->     set pnumber=pnumber+1

; ->fetch c_players into a_playerno;

->   end while

; ->

->close c_players; 關閉游標

->end

$$mysql>delimiter ;

mysql> call number_penalties(44

,@pnumber);

mysql> select

@pnumber;

+----------+

| @pnumber |

+----------+

| 3 |

+----------+

mysql游標的型別 MySQL 游標

以下的文章主要介紹的是mysql游標的使用筆記,其可以用在儲存過程的sql語句,其主要型別主要有以下幾種,以下就是對其詳細介紹,相信如果你掌握了這項技術,會在以後的學習或是工作中帶來很大的幫助。1 無返回結果語句,如 insert,update,drop,delete等 2 select語句返回單行...

游標的簡單使用

create table tablea tid int not null,mid int not null go insert into tablea values 2,2 insert into tablea values 3,3 insert into tablea values 4,4 ins...

游標的簡單使用

游標是從表中提取的資料以臨時表的形式存放記憶體中,游標中有乙個資料指標,預設指向的是第一條記錄。利用fetch語句移動該指標,從而對游標中的資料進行操作。語法 cursor 游標名 is select 語句 select是建立游標的資料表查詢命令.開啟游標 open 游標名 開啟游標相當於執行了下面...