日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

什么是mysql的游标_MySQL游标概念是什么 MySQL游标概念与用法介绍

發布時間:2024/1/23 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 什么是mysql的游标_MySQL游标概念是什么 MySQL游标概念与用法介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本篇文章小編給大家分享一下MySQL游標概念與用法介紹,小編覺得挺不錯的,現在分享給大家供大家參考,有需要的小伙伴們可以來看看。

1、游標的概念(Cursor)

一條sql,對應N條資源,取出資源的接口,就是游標,沿著游標,可以一次取出1行。如果開發過安卓的同學應該知道有一個Api是Cursor,也是讀取SQLite數據庫用的,和這個有點類似。

2、使用游標的步驟

(1)聲明

使用declare進行聲明

declare 游標名 cursor for select_statement

(2)打開游標

使用open進行打開

open 游標名

(3)從游標中取值

使用fetch進行取值

fetch 游標名 into var1,var2[,...] --將取到的一行賦值給多個變量

(4)關閉游標

使用close關閉游標

close 游標名

3、創建一個簡單的游標

需求:從商品表中讀取第一行數據

商品表(goods)數據:

注意:我這里已經將MySQL的結束標識符改為 $,如果要知道怎么設置為$,請參考前面一篇文章:MySQL觸發器。

定義:

create procedure p12()

begin

/*定義三個變量用于存放商品id,商品名稱,商品庫存量*/

declare row_gid int ;

declare row_name varchar(20);

declare row_num int;

declare getgoods cursor for select gid,name,num from goods; --定義游標

open getgoods; --打開游標

fetch getgoods into row_gid,row_name,row_num;--從游標中取值

select row_name,row_num; --顯示操作

close getgoods; --關閉游標

end$

輸出結果:

4、多次取值操作

create procedure p13()

begin

declare row_gid int ;

declare row_name varchar(20);

declare row_num int;

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

open getgoods;

fetch getgoods into row_gid,row_name,row_num;

select row_name,row_num;

fetch getgoods into row_gid,row_name,row_num;

select row_name,row_num;

fetch getgoods into row_gid,row_name,row_num;

select row_name,row_num;

fetch getgoods into row_gid,row_name,row_num;

select row_name,row_num;

close getgoods;

end$

輸出:

注意:當游標讀到末尾,如果繼續進行取值操作會發生報錯

5、游標循環表中的所有數據

(1)使用計數器來循環

create procedure p14()

begin

declare cnt int default 0;

declare i int default 0;

declare row_gid int ;

declare row_name varchar(20);

declare row_num int;

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

select count(*) into cnt from goods;

open getgoods;

repeat

fetch getgoods into row_gid,row_name,row_num;

select row_name,row_num;

set i:= i+1;

until i >= cnt end repeat;

close getgoods;

end$

輸出結果:

(2)使用越界標志來控制循環

在mysql cursor中,可以聲明declare continue handler來操作1個越界標志

語法:

declare continue handler for NOT FOUND statement;

使用:

create procedure p15()

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;

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

open getgoods;

repeat

fetch getgoods into row_gid,row_name,row_num;

select row_name,row_num;

until have = 0 end repeat;

close getgoods;

end$

輸出結果:

注意:這里發生了錯誤,這里輸出了4行數據,而表中只有3行數據,而且還爆出了警告,后面會說怎么結果這個問題。

程序執行邏輯:

循環游標->fetch第三條數據->顯示->fetch第四條數據->沒有數據->設置have=0操作->執行continue

Handler->程序不退出,執行顯示操作->還是顯示第三條數據

6、continue和exit的區別

continue:若沒有數據返回,程序繼續,并將變量IS_FOUND設為0,這種情況是出現在select XX into XXX from

tablename的時候發生的。

exit:若沒有數據返回,退出程序,并將變量IS_FOUND設為0,這種情況是出現在select XX into XXX

from tablename的時候發生的。

使用exit來替換continue:

使用exit就不會出現上面的那種情況了,程序執行邏輯:

循環游標->fetch到第三條數據->顯示->第四次fetch操作->沒有數據->設置

have=0操作->程序直接退出exit

所以就沒有顯示出第四條數據。

create procedure p16()

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;

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

open getgoods;

repeat

fetch getgoods into row_gid,row_name,row_num;

select row_name,row_num;

until have = 0 end repeat;

close getgoods;

end$

輸出結果:

7、正確的游標循環

在一些特殊的情況中,我們可以讀到的數據為空,或者壓根sql語句就有錯誤,我們不能避免出現這種情況,所以我們要正確的使用游標循環操作。

首先應該創建游標,然后打開游標后,應先手動進行fetch操作獲取到一行數據,然后再通過循環,在循環里先做處理內容,后進行fetch操作。這樣如果在手動獲取數據的期間就沒有獲得到數據的話,就會執行have

=

0,如果是repeat循環,然后進入repeat循環,先輸出null數據,最后又進行獲取,這樣運行到until時就會退出循環;如果是while循環,壓根就不進去while循環里,就不會有任何1行輸出。

(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$

輸出結果:

(2)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的游标_MySQL游标概念是什么 MySQL游标概念与用法介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

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