1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        MySQL存儲過程詳解

        共 2845字,需瀏覽 6分鐘

         ·

        2020-11-26 21:19

        點擊關(guān)注上方“SQL數(shù)據(jù)庫開發(fā)”,

        設(shè)為“置頂或星標(biāo)”,第一時間送達(dá)干貨

        經(jīng)常有小伙伴問我這個存儲過程該如何寫?作為過來人我剛開始也有這樣的苦惱,今天就給大家說說這個存儲過程該如何創(chuàng)建和使用。

        什么是存儲過程
        存儲過程是一組可編程的函數(shù),是為了完成特定功能的SQL語句集,經(jīng)編譯創(chuàng)建并保存在數(shù)據(jù)庫中,用戶可通過指定存儲過程的名字并給定參數(shù)(需要時)來調(diào)用執(zhí)行。

        關(guān)鍵詞:可編程,特定功能,調(diào)用

        創(chuàng)建存儲過程
        我們以表customers為例,通過傳遞客戶ID的值來查詢客戶的具體信息:
        表customers


        示例:

        CREATE?PROCEDURE?sp_customers(IN?cusid INT)
        BEGIN?
        ??SELECT?* FROM?customers WHERE?`客戶ID`=cusid;
        END;


        上面這是一個比較簡單的存儲過程,主要的功能就是用來查詢客戶信息。這里我們先簡單解釋一下:
        CREATE PROCEDURE:這是創(chuàng)建存儲過程的關(guān)鍵字,屬固定語法。
        sp_customers這是存儲過程名稱,當(dāng)我們執(zhí)行了該存儲過程后,系統(tǒng)就會出現(xiàn)一個該名稱的存儲過程,可以自定義。
        IN:這是輸入?yún)?shù)的意思,當(dāng)然也有輸出參數(shù)關(guān)鍵字OUT,同時也可以不定義參數(shù),直接讓參數(shù)為空。
        cusid INT:這是定義參數(shù)名和類型,這里我們定義了一個名為cusid,類型為INT的參數(shù)名。
        BEGIN ... END :這是存儲過程過程體的固定語法,你需要執(zhí)行的SQL功能就寫在這中間。

        調(diào)用存儲過程
        上面我們創(chuàng)建好了存儲過程以后,就可以調(diào)用了。調(diào)用存儲過程的語法很簡單:
        CALL??sp_name([參數(shù)])
        下面我們來調(diào)用上面的存儲過程sp_customers


        CALL?sp_customers(1);


        解釋:

        上面的代碼的意思就是將客戶ID為1的數(shù)據(jù),傳遞給存儲過程sp_customers,通過CALL來調(diào)用該存儲過程來執(zhí)行。
        結(jié)果為:

        細(xì)心的小伙伴可能已經(jīng)發(fā)現(xiàn)了,這不就是一個簡單的WHERE查詢語句嗎?是的,剛開始使用存儲過程時,其實不必把它神秘化,你越覺得它神秘越會覺得難以熟練使用。復(fù)雜的東西先簡單化,方可更進(jìn)一步掌握。

        過程體
        • 過程體即我們在調(diào)用時必須執(zhí)行的SQL語句,上面的SELECT查詢即為一個簡單的過程體。

        • 過程體包含DML、DDL語句,if-then-else和while-do語句、聲明變量的declare語句等

        • 過程體的格式上面也已經(jīng)演示過,以BEGIN開始,以END結(jié)尾(可以嵌套)。


        例如:


        BEGIN
        ??BEGIN
        ????BEGIN
        ??????-- SQL代碼;
        ????END
        ??END
        END


        注意:每個嵌套塊及其中的每條SQL語句,必須以分號(;)結(jié)束。表示過程體結(jié)束的BEGIN-END塊(又叫做復(fù)合語句compound statement),即END后面,則不需要分號。

        標(biāo)簽
        標(biāo)簽通常是與BEGIN-END一起使用,用來增強(qiáng)代碼的可讀性。語法為:
        [label_name:]?BEGIN
        ? ? [statement_list]?
        END?[label_name]
        例如:


        label1: BEGIN
        ??label2: BEGIN
        ????label3: BEGIN
        ??????--SQL代碼;
        ????END?label3 ;
        ??END?label2;
        END?label1


        該功能不常用,了解即可。

        存儲過程的參數(shù)
        上面我們大致的說了一下存儲過程參數(shù)定義,下面我們再詳細(xì)給大家講述參數(shù)該如何使用。
        參數(shù)類型
        • IN輸入?yún)?shù):表示調(diào)用者向過程傳入值(傳入值可以是字面量或變量)

        • OUT輸出參數(shù):表示過程向調(diào)用者傳出值(可以返回多個值)(傳出值只能是變量)

        • INOUT輸入輸出參數(shù):既表示調(diào)用者向過程傳入值,又表示過程向調(diào)用者傳出值(值只能是變量)


        IN輸入?yún)?shù)
        上面的示例就是一個輸入?yún)?shù)的示例,這里不贅述。

        OUT輸出參數(shù)


        CREATE?PROCEDURE?sp_customers_out(OUT?cusname VARCHAR(20))
        BEGIN
        ??SELECT?cusname;
        ??SELECT?`姓名`?INTO?cusname FROM?customers WHERE?`客戶ID`=1;
        ??SELECT?cusname;
        END


        調(diào)用上面的存儲過程:


        CALL?sp_customers_out(@cusname);


        結(jié)果為:
        結(jié)果1
        結(jié)果2
        上面我們定義了一個輸出參數(shù)為cusname的參數(shù)(這里參數(shù)類型如果有長度必須給定長度)。

        然后在過程體里面,我們輸出了兩次參數(shù)的結(jié)果,結(jié)果1為NULL,是因為我們的輸出參數(shù)cusname還沒有接收任何值,所以為NULL;
        結(jié)果2里面有了客戶姓名,是因為我們將客戶ID為1的客戶姓名傳遞給了輸出參數(shù)cusname。

        INOUT輸入輸出參數(shù)
        這個不常見,但是也有使用,即同一個參數(shù)既為輸入?yún)?shù),也為輸出參數(shù),我們把上面的存儲過程稍微修改一下就可以看出區(qū)別了。


        CREATE?PROCEDURE?sp_customers_inout(INOUT cusname VARCHAR(20))
        BEGIN
        ??SELECT?cusname;
        ??SELECT?`姓名`?INTO?cusname FROM?customers WHERE?`客戶ID`=2;
        ??SELECT?cusname;
        END


        調(diào)用上述存儲過程之前我們先給定一個輸入?yún)?shù):張三


        SET?@cusname='張三';
        CALL?sp_customers_inout(@cusname);


        結(jié)果為:
        結(jié)果1
        結(jié)果2

        上面我們定義了一個輸入輸出參數(shù)為cusname的參數(shù)。然后在過程體里面,我們輸出了兩次參數(shù)的結(jié)果:
        第一次我們將先定義好的“張三”(SET @cusname='張三')傳遞給參數(shù)cusname,此時它為輸入?yún)?shù)。進(jìn)入過程體后首先輸出結(jié)果1為“張三”,此時參數(shù)cusname為輸出參數(shù);
        然后通過查詢將客戶ID為2的客戶姓名再次傳遞給cusname,來改變它的值,此時它同樣為輸出參數(shù),只是輸出結(jié)果發(fā)生了改變。

        以上就是三個參數(shù)的用法,建議:
        • 需要輸入值時使用IN參數(shù);

        • 需要返回值時使用OUT參數(shù);

        • INOUT參數(shù)盡量少用。


        ——End——

        后臺回復(fù)關(guān)鍵字:1024,獲取一份精心整理的技術(shù)干貨
        后臺回復(fù)關(guān)鍵字:進(jìn)群,帶你進(jìn)入高手如云的交流群。
        推薦閱讀
        這是一個能學(xué)到技術(shù)的公眾號,歡迎關(guān)注

        點擊「閱讀原文」了解SQL訓(xùn)練營
        瀏覽 23
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            天堂久久网| 大屌色 | 美女脱个精光网站 | 男人插女人动态图 | 亚洲日韩精品高潮无码久久岛国久 | 裸体妓女大荫道BBw | 亚洲精品A片 | 动漫美女被到爽流男男 | 韩剧电影推荐大尺度 | 男女日皮免费视频 |