首頁 > 科技

Mysql遊標的定義與使用

2021-07-22 03:02:18

概念

遊標(Cursor)它使使用者可逐行訪問由SQLServer返回的結果集。

使用遊標(cursor)的一個主要的原因就是把集合操作轉換成單個記錄處理方式。

用SQL語言從資料庫中檢索資料後,結果放在記憶體的一塊區域中,且結果往往是一個含有多個記錄的集合。

遊標機制允許使用者在SQLserver內逐行地訪問這些記錄,按照使用者自己的意願來顯示和處理這些記錄。

優點

1、允許程式對由查詢語句select返回的行集合中的每一行執行相同或不同的操作,而不是對整個行集合執行同一個操作。

2、提供對基於遊標位置的表中的行進行刪除和更新的能力。

3、遊標實際上作為面向集合的資料庫管理系統(RDBMS)和麵向行的程式設計之間的橋樑,使這兩種處理方式通過遊標溝通起來。

1、遊標的作用:

1.1 如果你前面看過mysql函數,會發現無法使用返回多行結果的語句。但如果你又確實想要使用時,就需要使用到遊標,遊標可以幫你選擇出某個結果(這樣就可以做到返回單個結果)。

1.2 使用遊標也可以輕易的取出在檢索出來的行中前進或後退一行或多行的結果。

1.3 遊標可以遍歷返回的多行結果。

1.4 Mysql中游標只適用於儲存過程以及函數。

2、遊標的定義與語法:

1.定義遊標:declare 遊標名 cursor for select語句;

2.開啟遊標:open 遊標名;

獲取結果:fetch 遊標名 into 變數名[,變數名];

關閉遊標:close 遊標名;

--在windows系統中寫儲存過程時,如果需要使用declare聲明變數,需要新增這個關鍵字,否則會報錯。

delimiter //

drop procedure if exists StatisticStore;

CREATE PROCEDURE StatisticStore()

BEGIN

--創建接收遊標資料的變數

declare c int;

declare n varchar(20);

--創建總數變數

declare total int default 0;

--創建結束標誌變數

declare done int default false;

--創建遊標

declare cur cursor for select name,count from store where name = 'iphone';

--指定遊標迴圈結束時的返回值

declare continue HANDLER for not found set done = true;

--設定初始值

set total = 0;

--開啟遊標

open cur;

--開始循環遊標裡的資料

read_loop:loop

--根據遊標當前指向的一條資料

fetch cur into n,c;

--判斷遊標的迴圈是否結束

if done then

leave read_loop; --跳出遊標迴圈

end if;

--獲取一條資料時,將count值進行累加操作,這裡可以做任意你想做的操作,

set total = total + c;

--結束遊標迴圈

end loop;

--關閉遊標

close cur;

--輸出結果

select total;

END;

--呼叫儲存過程

call StatisticStore();

fetch是獲取遊標當前指向的資料行,並將指針指向下一行,當遊標已經指向最後一行時繼續執行會造成遊標溢位,可以定義一個變數來控制越界。如:

declare continue handler

例項:

declare continue handler for NOT FOUND statement;

遊標迴圈例項:

首先應該創建遊標,然後開啟遊標後,應先手動進行fetch操作獲取到一行資料,然後再通過迴圈,在迴圈裡先做處理內容,後進行fetch操作。這樣如果在手動獲取資料的期間就沒有獲得到資料的話,就會執行have = 0,如果是repeat迴圈,然後進入repeat迴圈,先輸出null資料,最後有進行獲取,這樣運行到until時就會退出迴圈;如果是while迴圈,壓根就不進去while迴圈裡,就不會有任何1行輸出。

repeat迴圈:

create procedure p17()

begin

declare row_gid int;

declare row_name varchar(20);

declare row_num int;

declare have int default 1;

declare getgoods cursor for select gid,name,num from goods where 0;

declare continue handler for NOT FOUND set have:= 0;

open getgoods;

fetch getgoods into row_gid,row_name,row_num;

repeat

select row_name,row_num;

fetch getgoods into row_gid,row_name,row_num;

until have = 0 end repeat;

close getgoods;

end$

while迴圈:

create procedure p18()

begin

declare row_gid int;

declare row_name varchar(20);

declare row_num int;

declare have int default 1;

declare getgoods cursor for select gid,name,num from goods where 0;

declare continue handler for NOT FOUND set have:= 0;

open getgoods;

fetch getgoods into row_gid,row_name,row_num;

while have = 1 do

select row_name,row_num;

fetch getgoods into row_gid,row_name,row_num;

end while;

close getgoods;

end$

好了,關於Mysql遊標的定義與使用就給大家介紹這麼多,希望對大家有所幫助!


IT145.com E-mail:sddin#qq.com