最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL游標(biāo)的介紹與使用

 更新時(shí)間:2022年12月16日 15:05:29   作者:知其黑、受其白  
雖然我們也可以通過篩選條件WHERE和HAVING,或者是限定返回記錄的關(guān)鍵字LIMIT返回一條記錄,但是,卻無(wú)法在結(jié)果集中像指針一樣,向前定位一條記錄、向后定位一條記錄,或者是隨意定位到某一條記錄,并對(duì)記錄的數(shù)據(jù)進(jìn)行處理

定義

游標(biāo)(Cursor)是處理數(shù)據(jù)的一種方法,為了查看或者處理結(jié)果集中的數(shù)據(jù),游標(biāo)提供了在結(jié)果集中一次一行遍歷數(shù)據(jù)的能力。

游標(biāo)也是一種面向過程的 sql 編程方法,所以一般在存儲(chǔ)過程、函數(shù)、觸發(fā)器、循環(huán)處理中使用。

游標(biāo)主要用于交互式應(yīng)用,其中用戶需要滾動(dòng)屏幕上的數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行瀏覽或做出更改。

游標(biāo)的作用

游標(biāo)相當(dāng)于一個(gè)指針,這個(gè)指針指向 select 的第一行數(shù)據(jù),可以通過移動(dòng)指針來遍歷后面的數(shù)據(jù)。

游標(biāo)是對(duì)查詢出來的結(jié)果集作為一個(gè)單元來有效的處理。

游標(biāo)可以定在該單元中的特定行,從結(jié)果集的當(dāng)前行檢索一行或多行。

可以對(duì)結(jié)果集當(dāng)前行做修改。

一般不使用游標(biāo),但是需要逐條處理數(shù)據(jù)的時(shí)候,游標(biāo)顯得十分重要。

游標(biāo)的使用

在mysql中,游標(biāo)可以在存儲(chǔ)過程、函數(shù)、觸發(fā)器和事件中使用。

游標(biāo)需要與相關(guān) handler 一起使用,并在 handler 之前定義。

游標(biāo)有以下三個(gè)屬性:

  • Asensitive: 數(shù)據(jù)庫(kù)也可以選擇不復(fù)制結(jié)果集
  • Read only: 不可更新,只讀
  • Nonscrollable: 游標(biāo)只能向一個(gè)方向前進(jìn),并且不可以跳過任何一行數(shù)據(jù)。

聲明游標(biāo):

創(chuàng)建一個(gè)游標(biāo),并指定這個(gè)游標(biāo)需要遍歷的select查詢,聲明游標(biāo)時(shí)并不會(huì)去執(zhí)行這個(gè)sql。

打開游標(biāo):

打開游標(biāo)的時(shí)候,會(huì)執(zhí)行游標(biāo)對(duì)應(yīng)的select語(yǔ)句。

遍歷數(shù)據(jù):

使用游標(biāo)循環(huán)遍歷select結(jié)果中每一行數(shù)據(jù),然后進(jìn)行處理。

業(yè)務(wù)操作:

對(duì)遍歷到的每行數(shù)據(jù)進(jìn)行操作的過程,可以放置任何需要執(zhí)行的執(zhí)行的語(yǔ)句(增刪改查):這里視具體情況而定。

關(guān)閉游標(biāo):

游標(biāo)使用完之后一定要釋放(游標(biāo)占用的內(nèi)存還是有點(diǎn)大的)。

注:使用的臨時(shí)字段需要在定義游標(biāo)之前進(jìn)行聲明。

游標(biāo)語(yǔ)法

游標(biāo)的使用過程:聲明游標(biāo)、打開游標(biāo)、遍歷游標(biāo)、關(guān)閉游標(biāo)

聲明游標(biāo):DECLARE 游標(biāo)名稱 CURSOR FOR 查詢語(yǔ)句;

打開游標(biāo):open 游標(biāo)名稱;

遍歷游標(biāo):fetch 游標(biāo)名稱 into 變量列表;

取出當(dāng)前行的結(jié)果,將結(jié)果放在對(duì)應(yīng)的變量中,并將游標(biāo)指針指向下一行的數(shù)據(jù)。

當(dāng)調(diào)用 fetch 的時(shí)候,會(huì)獲取當(dāng)前行的數(shù)據(jù),如果當(dāng)前行無(wú)數(shù)據(jù),會(huì)引發(fā) mysql 內(nèi)部的 NOT FOUND 錯(cuò)誤。

關(guān)閉游標(biāo):close 游標(biāo)名稱; 游標(biāo)使用完畢之后一定要關(guān)閉。

條件處理

DECLARE CONTINE HANDLER 表達(dá)式 1 SET 表達(dá)式 2:

這段代碼的作用是定義一個(gè) CONTINE HANDLER,這個(gè)的作用是當(dāng)表達(dá)式 1 的條件出現(xiàn)時(shí),將執(zhí)行表達(dá)式 2 的語(yǔ)句。

用這個(gè)語(yǔ)句可以實(shí)現(xiàn)條件的變更實(shí)質(zhì)是利用 mysql 的異常處理,也常常在游標(biāo)上使用,來輔助判斷游標(biāo)數(shù)據(jù)是否遍歷完了。

例如 DECLARE CONTINUE HANDLER FOR NOT FOUND … 的語(yǔ)句,這是為了對(duì)游標(biāo)沒有下一條記錄可供訪問的情況做出異常處理。

創(chuàng)建表-test1-test2-test3

DROP TABLE IF EXISTS test1; 
CREATE TABLE test1(a int,b int); 
INSERT INTO test1 VALUES (1,2),(3,4),(5,6); 
DROP TABLE IF EXISTS test2; 
CREATE TABLE test2(a int); 
INSERT INTO test2 VALUES (100),(200),(300); 
DROP TABLE IF EXISTS test3; 
CREATE TABLE test3(b int); 
INSERT INTO test3 VALUES (400),(500),(600);

寫一個(gè)函數(shù),計(jì)算 test1 表中 a、b 字段所有的和

/*刪除函數(shù)*/ 
DROP FUNCTION IF EXISTS fun1; 
/*聲明結(jié)束符為$*/ 
DELIMITER $ 
/*創(chuàng)建函數(shù)*/ 
CREATE FUNCTION fun1(v_max_a int) 
  RETURNS int 
  BEGIN 
    /*用于保存結(jié)果*/ 
    DECLARE v_total int DEFAULT 0; 
    /*創(chuàng)建一個(gè)變量,用來保存當(dāng)前行中a的值*/
    DECLARE v_a int DEFAULT 0; 
    /*創(chuàng)建一個(gè)變量,用來保存當(dāng)前行中b的值*/ 
    DECLARE v_b int DEFAULT 0; 
    /*創(chuàng)建游標(biāo)結(jié)束標(biāo)志變量*/ 
    DECLARE v_done int DEFAULT FALSE; 
    /*創(chuàng)建游標(biāo)*/ 
    DECLARE cur_test1 CURSOR FOR SELECT a,b from test1 where a<=v_max_a; 
    /*設(shè)置游標(biāo)結(jié)束時(shí)v_done的值為true,可以v_done來判斷游標(biāo)是否結(jié)束了*/ 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done=TRUE; 
    /*設(shè)置v_total初始值*/ 
    SET v_total = 0; 
    /*打開游標(biāo)*/ 
    OPEN cur_test1; 
    /*使用Loop循環(huán)遍歷游標(biāo)*/ 
    a:LOOP 
      /*先獲取當(dāng)前行的數(shù)據(jù),然后將當(dāng)前行的數(shù)據(jù)放入v_a,v_b中,如果當(dāng)前行無(wú)數(shù)據(jù),v_done會(huì)被置 為true*/
      FETCH cur_test1 INTO v_a, v_b; 
      /*通過v_done來判斷游標(biāo)是否結(jié)束了,退出循環(huán)*/ 
      if v_done THEN 
      LEAVE a; 
      END IF; 
      /*對(duì)v_total值累加處理*/ 
      SET v_total = v_total + v_a + v_b;
    END LOOP; 
    /*關(guān)閉游標(biāo)*/ 
    CLOSE cur_test1; 
    /*返回結(jié)果*/ 
    RETURN v_total; 
  END $ 
/*結(jié)束符置為;*/ 
DELIMITER ;

其中 DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done=TRUE;  是異常處理的語(yǔ)法,意思是當(dāng)遇到 NOT FOUND 錯(cuò)誤時(shí),將 v_done 設(shè)為 ture,continue 繼續(xù)執(zhí)行當(dāng)前任務(wù)。

測(cè)試

mysql> select * from test1;
+------+------+
| a    | b    |
+------+------+
|    1 |    2 |
|    3 |    4 |
|    5 |    6 |
+------+------+
3 rows in set (0.00 sec)
mysql> select fun1(1);
+---------+
| fun1(1) |
+---------+
|       3 |
+---------+
1 row in set (0.00 sec)
mysql> select fun1(4);
+---------+
| fun1(4) |
+---------+
|      10 |
+---------+
1 row in set (0.00 sec)
mysql> select * from test1;
+------+------+
| a    | b    |
+------+------+
|    1 |    2 |
|    3 |    4 |
|    5 |    6 |
+------+------+
3 rows in set (0.00 sec)
mysql> select fun1(5);
+---------+
| fun1(5) |
+---------+
|      21 |
+---------+
1 row in set (0.00 sec)

游標(biāo)過程解析

以上面的示例代碼為例,看一下游標(biāo)的詳細(xì)執(zhí)行過程。

游標(biāo)中有個(gè)指針,當(dāng)打開游標(biāo)的時(shí)候,才會(huì)執(zhí)行游標(biāo)對(duì)應(yīng)的 select 語(yǔ)句,這個(gè)指針會(huì)指向select 結(jié)果中第一行記錄。

當(dāng)調(diào)用 fetch 游標(biāo)名稱時(shí),會(huì)獲取當(dāng)前行的數(shù)據(jù),如果當(dāng)前行無(wú)數(shù)據(jù),會(huì)觸發(fā) NOT FOUND 異常,當(dāng)觸發(fā) NOT FOUND 異常的時(shí)候,我們可以使用一個(gè)變量來標(biāo)記一下,如下代碼:

DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done=TRUE;

當(dāng)游標(biāo)無(wú)數(shù)據(jù)觸發(fā) NOT FOUND 異常的時(shí)候,將變量 v_down 的值置為 TURE ,循環(huán)中就可以通過 v_down 的值控制循環(huán)的退出。

如果當(dāng)前行有數(shù)據(jù),則將當(dāng)前行數(shù)據(jù)存到對(duì)應(yīng)的變量中,并將游標(biāo)指針指向下一行數(shù)據(jù),如下語(yǔ)句:

fetch 游標(biāo)名稱 into 變量列表;

到此這篇關(guān)于MySQL游標(biāo)的介紹與使用的文章就介紹到這了,更多相關(guān)MySQL游標(biāo)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL導(dǎo)入csv、excel或者sql文件的小技巧

    MySQL導(dǎo)入csv、excel或者sql文件的小技巧

    這篇文章主要介紹了MySQL導(dǎo)入csv、excel或者sql文件的小技巧,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,一起跟隨小編過來看看吧
    2018-05-05
  • mysql過濾復(fù)制思路詳解

    mysql過濾復(fù)制思路詳解

    這篇文章主要介紹了mysql過濾復(fù)制的實(shí)現(xiàn)思路,主要講解了兩種思路,一種是在主庫(kù)的binlog上實(shí)現(xiàn)另一種是從庫(kù)的sql線程上實(shí)現(xiàn),具體實(shí)現(xiàn)過程跟隨小編一起看看吧
    2021-08-08
  • MySql批量插入時(shí)如何不重復(fù)插入數(shù)據(jù)

    MySql批量插入時(shí)如何不重復(fù)插入數(shù)據(jù)

    Mysql插入不重復(fù)的數(shù)據(jù),當(dāng)大數(shù)據(jù)量的數(shù)據(jù)需要插入值時(shí),要判斷插入是否重復(fù),然后再插入,那么如何提高效率,本文就詳細(xì)的介紹一下,感興趣的可以了解一下
    2021-06-06
  • 為什么Mysql?數(shù)據(jù)庫(kù)表中有索引還是查詢慢

    為什么Mysql?數(shù)據(jù)庫(kù)表中有索引還是查詢慢

    這篇文章主要介紹了為什么Mysql數(shù)據(jù)庫(kù)表中有索引還是查詢慢,以?user_info?這張表來作為分析的基礎(chǔ),在?user_info?這張表上,我們分別創(chuàng)建了idx_name以及idx_phone?二級(jí)索引以及?idx_age_address?聯(lián)合索引展開詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-05-05
  • MySql8.023安裝過程圖文詳解(首次安裝)

    MySql8.023安裝過程圖文詳解(首次安裝)

    這篇文章主要介紹了MySql8.023安裝過程(首次安裝),本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • 詳解mysql8.018在linux上安裝與配置過程

    詳解mysql8.018在linux上安裝與配置過程

    這篇文章主要介紹了mysql8.018在linux上安裝與配置過程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • window下mysql 8.0.15 安裝配置方法圖文教程

    window下mysql 8.0.15 安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了window下mysql 8.0.15 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • Linux中部署MySQL環(huán)境的四種方式圖文詳解

    Linux中部署MySQL環(huán)境的四種方式圖文詳解

    這篇文章主要介紹了Linux中部署MySQL環(huán)境的四種方式,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-11-11
  • MySQL DDL 引發(fā)的同步延遲該如何解決

    MySQL DDL 引發(fā)的同步延遲該如何解決

    這篇文章主要介紹了MySQL DDL 引發(fā)的同步延遲該如何解決,幫助大家更好的理解和學(xué)習(xí)使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2021-05-05
  • MySQL 8.0.19支持輸入3次錯(cuò)誤密碼鎖定賬戶功能(例子)

    MySQL 8.0.19支持輸入3次錯(cuò)誤密碼鎖定賬戶功能(例子)

    這篇文章主要介紹了MySQL 8.0.19支持輸入3次錯(cuò)誤密碼鎖定賬戶功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01

最新評(píng)論

桃园市| 武清区| 盘山县| 和平区| 建瓯市| 信阳市| 宁城县| 屯昌县| 徐水县| 阳朔县| 临夏县| 滨海县| 中江县| 城步| 沈丘县| 乌兰察布市| 松桃| 南昌市| 茶陵县| 石河子市| 西昌市| 太仆寺旗| 梓潼县| 黄陵县| 苏尼特右旗| 双流县| 望谟县| 夹江县| 郸城县| 马公市| 左云县| 毕节市| 郯城县| 金山区| 财经| 青海省| 马山县| 育儿| 内乡县| 克什克腾旗| 丽江市|