激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - MySQL游標概念與用法詳解

MySQL游標概念與用法詳解

2020-11-20 17:21webbc Mysql

這篇文章主要介紹了MySQL游標概念與用法,簡單描述了mysql游標的概念、原理并結合實例形式詳細分析了游標的各種常見用法與相關操作注意事項,需要的朋友可以參考下

本文實例講述了mysql游標概念與用法。分享給大家供大家參考,具體如下:

1、游標的概念(cursor)

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

2、使用游標的步驟

(1)聲明

使用declare進行聲明

?
1
declare 游標名 cursor for select_statement

(2)打開游標

使用open進行打開

?
1
open 游標名

(3)從游標中取值

使用fetch進行取值

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

(4)關閉游標

使用close關閉游標

?
1
close 游標名

3、創建一個簡單的游標

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

商品表(goods)數據:

MySQL游標概念與用法詳解

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

定義:

?
1
2
3
4
5
6
7
8
9
10
11
12
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$

輸出結果:

MySQL游標概念與用法詳解

4、多次取值操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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$

輸出:

MySQL游標概念與用法詳解

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

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

(1)使用計數器來循環

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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$

輸出結果:

MySQL游標概念與用法詳解

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

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

語法:

?
1
declare continue handler for not found statement;

使用:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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$

輸出結果:

MySQL游標概念與用法詳解

注意:這里發生了錯誤,這里輸出了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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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$

輸出結果:

MySQL游標概念與用法詳解

7、正確的游標循環

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

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

(1)repeat循環:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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$

輸出結果:

MySQL游標概念與用法詳解

(2)while循環:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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數據庫計有所幫助。

原文鏈接:https://blog.csdn.net/baochao95/article/details/53239463

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人午夜在线播放 | 国产精品一区在线免费观看 | 欧美城网站地址 | 国产精品成人久久久久a级 欧美特黄一级高清免费的香蕉 | 老a影视网站在线观看免费 欧美日韩成人一区二区 | 国产剧情在线观看一区二区 | 午夜视频在线观看免费视频 | 全黄性色大片 | 久久出精品 | 欧美一区2区三区4区公司二百 | 成人免费观看毛片 | xxxeexxx性国产 | a免费视频| 永久免费av片在线观看全网站 | 美国黄色毛片女人性生活片 | 中文字幕视频在线播放 | 久久精品国产一区二区 | 欧美视频国产 | 欧美性生活网站 | 国产日韩在线 | 国产精品麻豆91 | 天天操很很操 | 国产成人在线一区 | 亚洲精品 在线播放 | 亚洲综合一区在线观看 | 九九热视频免费观看 | 国产精品久久久乱弄 | 在线亚洲欧美 | 99这里精品| 在线影院av | 国产一级在线观看视频 | 国产成人精品一区在线播放 | 91网站永久免费看 | 毛片毛片免费看 | 久久久久久久久久性 | 久久精品国产精品亚洲 | 欧美精品久久久久久久久久 | 91专区在线观看 | 国产超碰人人做人人爱 | 毛片在线免费观看视频 | 国产女厕一区二区三区在线视 |