文章插圖

文章插圖
經常有小伙伴問我這個存儲過程該如何寫?作為過來人我剛開始也有這樣的苦惱,今天就給大家說說這個存儲過程該如何創建和使用 。
什么是存儲過程
存儲過程是一組可編程的函數,是為了完成特定功能的SQL語句集,經編譯創建并保存在數據庫中,用戶可通過指定存儲過程的名字并給定參數(需要時)來調用執行 。
關鍵詞:可編程,特定功能,調用
創建存儲過程
我們以表customers為例,通過傳遞客戶ID的值來查詢客戶的具體信息:
示例:
CREATEPROCEDUREsp_customers(INcusidINT)BEGINSELECT*FROMcustomersWHERE`客戶ID`=cusid;END;上面這是一個比較簡單的存儲過程,主要的功能就是用來查詢客戶信息 。這里我們先簡單解釋一下:CREATE PROCEDURE:這是創建存儲過程的關鍵字,屬固定語法 。sp_customers:這是存儲過程名稱,當我們執行了該存儲過程后,系統就會出現一個該名稱的存儲過程,可以自定義 。IN:這是輸入參數的意思,當然也有輸出參數關鍵字OUT,同時也可以不定義參數,直接讓參數為空 。cusid INT:這是定義參數名和類型,這里我們定義了一個名為cusid,類型為INT的參數名 。BEGIN … END :這是存儲過程過程體的固定語法,你需要執行的SQL功能就寫在這中間 。調用存儲過程
上面我們創建好了存儲過程以后,就可以調用了 。調用存儲過程的語法很簡單:
CALLsp_name([參數])下面我們來調用上面的存儲過程sp_customersCALLsp_customers(1);解釋:上面的代碼的意思就是將客戶ID為1的數據,傳遞給存儲過程sp_customers,通過CALL來調用該存儲過程來執行 。
結果為
過程體
過程體即我們在調用時必須執行的SQL語句,上面的SELECT查詢即為一個簡單的過程體 。過程體包含DML、DDL語句,if-then-else和while-do語句、聲明變量的declare語句等過程體的格式上面也已經演示過,以BEGIN開始,以END結尾(可以嵌套) 。
例如:
BEGINBEGINBEGIN--SQL代碼;ENDENDEND注意:每個嵌套塊及其中的每條SQL語句,必須以分號(;)結束 。表示過程體結束的BEGIN-END塊(又叫做復合語句compound statement),即END后面,則不需要分號 。標簽
標簽通常是與BEGIN-END一起使用,用來增強代碼的可讀性 。語法為:
[label_name:]BEGIN[statement_list]END[label_name]例如:label1:BEGINlabel2:BEGINlabel3:BEGIN--SQL代碼;ENDlabel3;ENDlabel2;ENDlabel1該功能不常用,了解即可 。存儲過程的參數
上面我們大致的說了一下存儲過程參數定義,下面我們再詳細給大家講述參數該如何使用 。參數類型
IN輸入參數:表示調用者向過程傳入值(傳入值可以是字面量或變量)OUT輸出參數:表示過程向調用者傳出值(可以返回多個值)(傳出值只能是變量)INOUT輸入輸出參數:既表示調用者向過程傳入值,又表示過程向調用者傳出值(值只能是變量)
IN輸入參數
上面的示例就是一個輸入參數的示例,這里不贅述 。
OUT輸出參數
CREATEPROCEDUREsp_customers_out(OUTcusnameVARCHAR(20))BEGINSELECTcusname;SELECT`姓名`INTOcusnameFROMcustomersWHERE`客戶ID`=1;SELECTcusname;END調用上面的存儲過程:CALLsp_customers_out(@cusname);結果為:上面我們定義了一個輸出參數為cusname的參數(這里參數類型如果有長度必須給定長度) 。
然后在過程體里面,我們輸出了兩次參數的結果,結果1為NULL,是因為我們的輸出參數cusname還沒有接收任何值,所以為NULL;結果2里面有了客戶姓名,是因為我們將客戶ID為1的客戶姓名傳遞給了輸出參數cusname 。
INOUT輸入輸出參數
這個不常見,但是也有使用,即同一個參數既為輸入參數,也為輸出參數,我們把上面的存儲過程稍微修改一下就可以看出區別了 。
CREATEPROCEDUREsp_customers_inout(INOUTcusnameVARCHAR(20))BEGINSELECTcusname;SELECT`姓名`INTOcusnameFROMcustomersWHERE`客戶ID`=2;SELECTcusname;END調用上述存儲過程之前我們先給定一個輸入參數:張三[email protected]='張三';CALLsp_customers_inout(@cusname);結果為:上面我們定義了一個輸入輸出參數為cusname的參數 。然后在過程體里面,我們輸出了兩次參數的結果:第一次我們將先定義好的“張三”(SET @cusname=’張三’)傳遞給參數cusname,此時它為輸入參數 。進入過程體后首先輸出結果1為“張三”,此時參數cusname為輸出參數;然后通過查詢將客戶ID為2的客戶姓名再次傳遞給cusname,來改變它的值,此時它同樣為輸出參數,只是輸出結果發生了改變 。
以上就是三個參數的用法,建議:
需要輸入值時使用IN參數;需要返回值時使用OUT參數;INOUT參數盡量少用 。
- c語言排序的幾種方法 c語言排序的三種方法
- php函數的定義和調用 php調用類方法
- 蘋果手機6s的價格 蘋果6s市場價格是多少
- 線程通信的幾種方式 線程通信的三種方式
- 汽車 15個油是什么意思
- 冠詞,語言 冠詞有哪些
- 圖片分類管理軟件排行2020 分類管理圖片的軟件
- 種類 吉他的種類介紹
- 手機如何解壓忘記密碼的壓縮包 手機壓縮包忘了密碼怎么打開
- 程序的特征和算法的特征本質上一樣嗎 算法具有哪些特征
