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 游標名 開啟游標相當於執行了下面...