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

MySql存儲(chǔ)過(guò)程和游標(biāo)的使用實(shí)例

 更新時(shí)間:2022年04月24日 16:10:30   作者:愛(ài)吃奶酪的松鼠丶  
我們?cè)趯?shí)際的開(kāi)發(fā)中會(huì)遇到一些統(tǒng)計(jì)的業(yè)務(wù)功能,如果我實(shí)時(shí)的去查詢的話有時(shí)候會(huì)很慢,此時(shí)我們可以寫(xiě)一個(gè)存儲(chǔ)過(guò)程來(lái)實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于MySql存儲(chǔ)過(guò)程和游標(biāo)使用的相關(guān)資料,需要的朋友可以參考下

前言

這里存儲(chǔ)過(guò)程和游標(biāo)的定義和作用就不介紹了,網(wǎng)上挺多的,只通過(guò)簡(jiǎn)單的介紹,然后用個(gè)案例讓大家快速了解。實(shí)例中會(huì)具體說(shuō)明變量的定義,賦值,游標(biāo)的使用,控制語(yǔ)句,循環(huán)語(yǔ)句的介紹。

1.創(chuàng)建存儲(chǔ)過(guò)程。

CREATE PROCEDURE myproc(OUT s int)
    BEGIN
      SELECT COUNT(*) INTO s FROM students;
    END

存儲(chǔ)過(guò)程根據(jù)需要可能會(huì)有輸入、輸出、輸入輸出參數(shù),如果有多個(gè)參數(shù)用","分割開(kāi)。MySQL存儲(chǔ)過(guò)程的參數(shù)用在存儲(chǔ)過(guò)程的定義,共有三種參數(shù)類(lèi)型,IN,OUT,INOUT:

  • IN參數(shù)的值必須在調(diào)用存儲(chǔ)過(guò)程時(shí)指定,在存儲(chǔ)過(guò)程中修改該參數(shù)的值不能被返回,為默認(rèn)值
  • OUT:該值可在存儲(chǔ)過(guò)程內(nèi)部被改變,并可返回
  • INOUT:調(diào)用時(shí)指定,并且可被改變和返回

2.查看存儲(chǔ)過(guò)程名稱

SELECT routine_name FROM information_schema.routines WHERE routine_schema='數(shù)據(jù)庫(kù)名稱';

3.調(diào)用存儲(chǔ)過(guò)程

CALL myproc()

4.刪除存儲(chǔ)過(guò)程

DROP PROCEDURE IF EXISTS myproc;

因?yàn)閙ysql中游標(biāo)只能在存儲(chǔ)過(guò)程和方法中使用,所以就直接通過(guò)案例介紹游標(biāo)。

案例:該案例采用無(wú)參存儲(chǔ)過(guò)程,有參的也挺簡(jiǎn)單,根據(jù)上面的介紹,對(duì)應(yīng)實(shí)現(xiàn)就行,該存儲(chǔ)過(guò)程主要就創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,用它做查詢 修改等操作。

#檢查該存儲(chǔ)過(guò)程是否存在 存在就刪除了再創(chuàng)建
DROP PROCEDURE IF EXISTS processnames ;
#創(chuàng)建存儲(chǔ)過(guò)程
CREATE PROCEDURE processnames()
#BEGIN END  存儲(chǔ)過(guò)程中的sql邏輯寫(xiě)在BEGIN 和END 中
BEGIN
#定義變量
DECLARE var_name VARCHAR(300);
DECLARE var_uuid VARCHAR(300);
DECLARE count int DEFAULT 0 ;
DECLARE i int DEFAULT 0 ;
DECLARE done INT;
#定義游標(biāo)
DECLARE nameCursor CURSOR FOR SELECT ParentId FROM datadictionary GROUP BY ParentId;
#該sql語(yǔ)句作用是  在你遍歷游標(biāo)的時(shí)候  游標(biāo)循環(huán)結(jié)束 就會(huì)執(zhí)行這句話,并給done賦值為1 然后循環(huán)就會(huì)停止 但該語(yǔ)句不適用WHILE 循環(huán)語(yǔ)句。
DECLARE continue handler FOR SQLSTATE '02000' SET done = 1;
#查詢一個(gè)表分組的總數(shù)量  并賦值給count變量
SELECT count(*) into count FROM (SELECT ParentId FROM datadictionary GROUP BY ParentId) t1;
#打開(kāi)游標(biāo)
OPEN nameCursor;
#循環(huán)體
    WHILE i<count DO
    #拿到游標(biāo)指向的當(dāng)前行的數(shù)據(jù)  并賦值給var_name變量
    FETCH nameCursor INTO var_name;
    #通過(guò)var_name變量進(jìn)行相應(yīng)的數(shù)據(jù)查詢 把查詢出來(lái)的數(shù)據(jù)通過(guò)into賦值給變量var_uuid
    SELECT uuid into var_uuid FROM datadictionary WHERE ID=var_name;
    #進(jìn)行修改操作
    UPDATE datadictionary SET ParentId=var_uuid WHERE ParentId=var_name;
    #可以通過(guò)set 給變量賦值  這里用來(lái)記錄循環(huán)體執(zhí)行了多少次  看和游標(biāo)遍歷的條數(shù)是否一致
  SET i=i+1;
    #當(dāng)i>count的時(shí)候循環(huán)體結(jié)束
  END WHILE;
    #關(guān)閉游標(biāo)
    CLOSE nameCursor;
    #打印i 
    SELECT i;
    #查看修改后的數(shù)據(jù)
    SELECT * FROM datadictionary;
    #存儲(chǔ)過(guò)程結(jié)束標(biāo)志
END;
#調(diào)用存儲(chǔ)過(guò)程
CALL processnames()

案例2 添加操作,并且獲取游標(biāo)中的多列值

DROP PROCEDURE if EXISTS proce;
CREATE PROCEDURE proce()
BEGIN
 DECLARE  userid VARCHAR(50);
 DECLARE  depatementid VARCHAR(50);
 DECLARE  done INT; 
 DECLARE nameCuursor CURSOR FOR SELECT id,FrameworkDepartmentId FROM frameworkusers ;
 DECLARE  continue handler FOR SQLSTATE '02000' SET done = 1;
 OPEN nameCuursor;
label: LOOP
  FETCH nameCuursor INTO userid,depatementid;
    IF done = 1 THEN
        LEAVE label; 
    END IF; 
    INSERT into frameworkdepartmentuser(ID,FrameworkUserId,FrameworkDepartmentId) VALUES(UUID(),userid,depatementid);
END LOOP label;
CLOSE nameCuursor;
END;
CALL proce();
SELECT * FROM frameworkdepartmentuser

注意:

1.DECLARE關(guān)鍵字 在存儲(chǔ)過(guò)程內(nèi)部就是定義變量的。

2.DECLARE nameCursor CURSOR FOR SELECT ParentId FROM datadictionary GROUP BY ParentId;該語(yǔ)句用來(lái)定義游標(biāo),其中FOR后面跟隨的是你的查詢語(yǔ)句,把查詢出來(lái)的結(jié)果賦值給了nameCursor這個(gè)游標(biāo)

2.1 遍歷游標(biāo)前一定要先打開(kāi)游標(biāo) OPEN nameCursor;

2.2 遍歷結(jié)束 一定要關(guān)閉游標(biāo),CLOSE nameCursor;如果不關(guān)閉當(dāng)存儲(chǔ)過(guò)程執(zhí)行完遇到最后一個(gè)END的時(shí)候也會(huì)自動(dòng)關(guān)閉。

3.DECLARE continue handler FOR SQLSTATE '02000' SET done = 1; 有很多人不知道這段是什么意思,我開(kāi)始也不知道,首先本案例中這段話可以直接注釋?zhuān)瑳](méi)有作用,一般在沒(méi)有條件體的循環(huán)體中使用,如:REPEAT statement_list UNTIL search_condition END REPEAT;循環(huán)體和LOOP 循環(huán)體使用的比較多。該句話的意思如注釋所說(shuō),當(dāng)你沒(méi)有循環(huán)條件作為循環(huán)結(jié)束語(yǔ)句的時(shí)候,就可以用到上面DECLARE continue handler FOR SQLSTATE '02000' SET done = 1;該句話的作用就是:當(dāng)你游標(biāo)在上述循環(huán)體中遍歷結(jié)束的時(shí)候,就會(huì)執(zhí)行該語(yǔ)句,讓done =1;打個(gè)比方,假如你用的是REPEAT statement_list UNTIL search_condition END REPEAT;語(yǔ)句作為循環(huán)體,我們可寫(xiě)成UNTIL done因?yàn)镽EPEAT循環(huán)體執(zhí)行順序是先執(zhí)行一次sql語(yǔ)句流然后再進(jìn)行UNTIL done進(jìn)行判斷,當(dāng)游標(biāo)遍歷結(jié)束,done=1然后循環(huán)體結(jié)束。SQLSTATE '02000'只是一個(gè)標(biāo)識(shí),具體可以官網(wǎng)查詢。

然后再簡(jiǎn)單說(shuō)下

label: LOOP
?? ?statement_list

?? ?IF done=1 THEN
?? ??? ?LEAVE label;?
?? ?END IF;?
END LOOP label;

其中statement_list還是你需要執(zhí)行的sql流,Loop和REPEAT有點(diǎn)像,都是先執(zhí)行,再判斷。我案例中是用的WHILE 該循環(huán)體是先判斷條件,再執(zhí)行,比較符合我當(dāng)前的運(yùn)用場(chǎng)景。

4. FETCH nameCursor INTO var_name;把當(dāng)前游標(biāo)指向的行賦值給變量,這里游標(biāo)執(zhí)行過(guò)程是順序執(zhí)行的,就相當(dāng)于遍歷數(shù)組,從第一個(gè)一直遍歷到最后一個(gè)。

5. 如果需要把查詢出來(lái)的結(jié)果,賦值給一個(gè)變量,可以使用into如這樣:SELECT uuid into var_uuid FROM datadictionary WHERE ID=var_name;

6. 如果非查詢賦值,可以用set如:SET i=i+1;

7. 獲取一行游標(biāo)中的多列值,只需定義和列關(guān)聯(lián)的變量,然后用into進(jìn)行賦值 如例2:FETCH nameCuursor INTO userid,depatementid;

總結(jié)

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

相關(guān)文章

  • Mysql字符集utf8和utf8mb4詳解

    Mysql字符集utf8和utf8mb4詳解

    文章介紹了MySQL中utf8和utf8mb4兩種字符集的區(qū)別,包括編碼方式、存儲(chǔ)空間、索引長(zhǎng)度以及支持的Unicode字符范圍,同時(shí),通過(guò)創(chuàng)建兩個(gè)表并插入數(shù)據(jù)進(jìn)行存儲(chǔ)長(zhǎng)度的比較,驗(yàn)證了上述理論
    2024-12-12
  • Mysql啟動(dòng)與數(shù)據(jù)庫(kù)的創(chuàng)建方法[圖文]

    Mysql啟動(dòng)與數(shù)據(jù)庫(kù)的創(chuàng)建方法[圖文]

    Mysql啟動(dòng)與數(shù)據(jù)庫(kù)的創(chuàng)建方法,mysql數(shù)據(jù)庫(kù)入門(mén)
    2012-03-03
  • mysql8.0?.ibd文件恢復(fù)表結(jié)構(gòu)的實(shí)現(xiàn)

    mysql8.0?.ibd文件恢復(fù)表結(jié)構(gòu)的實(shí)現(xiàn)

    本文主要介紹了mysql8.0?.ibd文件恢復(fù)表結(jié)構(gòu)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • MySQL8.0.19安裝教程

    MySQL8.0.19安裝教程

    這篇文章主要介紹了MySQL8.0.19安裝教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 揭開(kāi)SQL中NULL的神秘面紗

    揭開(kāi)SQL中NULL的神秘面紗

    表的字段默認(rèn)允許存放NULL值,這意味著,您在插入記錄或者更新記錄時(shí),可以不為該字段指定值,此時(shí)該字段將存儲(chǔ)NULL值,這篇文章將揭開(kāi)SQL中NULL的神秘面紗。這個(gè)問(wèn)題可能困擾著很多初級(jí)開(kāi)發(fā)者
    2023-01-01
  • MySQL數(shù)據(jù)庫(kù)大小寫(xiě)敏感的問(wèn)題

    MySQL數(shù)據(jù)庫(kù)大小寫(xiě)敏感的問(wèn)題

    今天小編就為大家分享一篇關(guān)于MySQL數(shù)據(jù)庫(kù)大小寫(xiě)敏感的問(wèn)題,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • MySQL字段自增自減的SQL語(yǔ)句示例介紹

    MySQL字段自增自減的SQL語(yǔ)句示例介紹

    MySQL的自增語(yǔ)句大家應(yīng)該都很熟悉,本文為大家介紹下MySQL字段自增自減的SQL語(yǔ)句,需要的朋友可以參考下
    2014-02-02
  • mysql4.0升級(jí)到mysql5(4.1),解決字符集問(wèn)題

    mysql4.0升級(jí)到mysql5(4.1),解決字符集問(wèn)題

    軟件升級(jí)部分就不說(shuō)了,光說(shuō)數(shù)據(jù)庫(kù)遷移。
    2009-09-09
  • mysql中find_in_set()函數(shù)用法及自定義增強(qiáng)函數(shù)

    mysql中find_in_set()函數(shù)用法及自定義增強(qiáng)函數(shù)

    MySQL 中的 FIND_IN_SET 函數(shù)用于在逗號(hào)分隔的字符串列表中查找指定字符串的位置,本文就來(lái)介紹一下mysql中find_in_set()函數(shù)用法及自定義增強(qiáng)函數(shù)
    2024-08-08
  • Mysql 報(bào)Row size too large 65535 的原因及解決方法

    Mysql 報(bào)Row size too large 65535 的原因及解決方法

    這篇文章主要介紹了Mysql 報(bào)Row size too large 65535 的原因及解決方法 的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06

最新評(píng)論

乌恰县| 抚宁县| 拉萨市| 庆城县| 裕民县| 虞城县| 宽城| 岐山县| 正安县| 宕昌县| 宜城市| 阿坝县| 河东区| 巨野县| 桑植县| 宾川县| 新平| 平邑县| 三台县| 乐至县| 九龙城区| 绵竹市| 白河县| 湟源县| 定日县| 措美县| 黎平县| 雷山县| 凭祥市| 衡山县| 富裕县| 迁安市| 宜良县| 鄯善县| 尚义县| 阿瓦提县| 拜泉县| 赤城县| 景泰县| 嘉峪关市| 富顺县|