經常有小夥伴問我這個存儲過程該如何寫?作為過來人我剛開始也有這樣的苦惱,今天就給大家說說這個存儲過程該如何創建和使用。
什麼是存儲過程
存儲過程是一組可編程的函數,是為了完成特定功能的SQL語句集,經編譯創建並保存在資料庫中,用戶可通過指定存儲過程的名字並給定參數(需要時)來調用執行。
關鍵詞:可編程,特定功能,調用
創建存儲過程
我們以表customers為例,通過傳遞客戶ID的值來查詢客戶的具體信息:
表customers
示例:
CREATE PROCEDURE sp_customers(IN cusid INT) BEGIN SELECT * FROM customers WHERE `客戶ID`=cusid; END;
上面這是一個比較簡單的存儲過程,主要的功能就是用來查詢客戶信息。這裡我們先簡單解釋一下:CREATE PROCEDURE:這是創建存儲過程的關鍵字,屬固定語法。sp_customers:這是存儲過程名稱,當我們執行了該存儲過程後,系統就會出現一個該名稱的存儲過程,可以自定義。IN:這是輸入參數的意思,當然也有輸出參數關鍵字OUT,同時也可以不定義參數,直接讓參數為空。cusid INT:這是定義參數名和類型,這裡我們定義了一個名為cusid,類型為INT的參數名。BEGIN ... END :這是存儲過程過程體的固定語法,你需要執行的SQL功能就寫在這中間。
調用存儲過程
上面我們創建好了存儲過程以後,就可以調用了。調用存儲過程的語法很簡單:
CALL sp_name([參數])
下面我們來調用上面的存儲過程sp_customers
CALL sp_customers(1);
解釋:
上面的代碼的意思就是將客戶ID為1的數據,傳遞給存儲過程sp_customers,通過CALL來調用該存儲過程來執行。
結果為
細心的小夥伴可能已經發現了,這不就是一個簡單的WHERE查詢語句嗎?是的,剛開始使用存儲過程時,其實不必把它神秘化,你越覺得它神秘越會覺得難以熟練使用。複雜的東西先簡單化,方可更進一步掌握。
過程體
例如:
BEGIN BEGIN BEGIN -- SQL代碼; END END END
注意:每個嵌套塊及其中的每條SQL語句,必須以分號(;)結束。表示過程體結束的BEGIN-END塊(又叫做複合語句compound statement),即END後面,則不需要分號。
標籤
標籤通常是與BEGIN-END一起使用,用來增強代碼的可讀性。語法為:
[label_name:] BEGIN [statement_list] END [label_name]
例如:
label1: BEGIN label2: BEGIN label3: BEGIN --SQL代碼; END label3 ; END label2; END label1
該功能不常用,了解即可。
存儲過程的參數
上面我們大致的說了一下存儲過程參數定義,下面我們再詳細給大家講述參數該如何使用。參數類型
IN輸入參數
上面的示例就是一個輸入參數的示例,這裡不贅述。
OUT輸出參數
CREATE PROCEDURE sp_customers_out(OUT cusname VARCHAR(20)) BEGIN SELECT cusname; SELECT `姓名` INTO cusname FROM customers WHERE `客戶ID`=1; SELECT cusname; END
調用上面的存儲過程:
CALL sp_customers_out(@cusname);
結果為:
結果1
結果2
上面我們定義了一個輸出參數為cusname的參數(這裡參數類型如果有長度必須給定長度)。
然後在過程體裡面,我們輸出了兩次參數的結果,結果1為NULL,是因為我們的輸出參數cusname還沒有接收任何值,所以為NULL;結果2裡面有了客戶姓名,是因為我們將客戶ID為1的客戶姓名傳遞給了輸出參數cusname。
INOUT輸入輸出參數
這個不常見,但是也有使用,即同一個參數既為輸入參數,也為輸出參數,我們把上面的存儲過程稍微修改一下就可以看出區別了。
CREATE PROCEDURE sp_customers_inout(INOUT cusname VARCHAR(20)) BEGIN SELECT cusname; SELECT `姓名` INTO cusname FROM customers WHERE `客戶ID`=2; SELECT cusname; END
調用上述存儲過程之前我們先給定一個輸入參數:張三
SET @cusname='張三'; CALL sp_customers_inout(@cusname);
結果為:
結果1
結果2
上面我們定義了一個輸入輸出參數為cusname的參數。然後在過程體裡面,我們輸出了兩次參數的結果:第一次我們將先定義好的「張三」(SET @cusname='張三')傳遞給參數cusname,此時它為輸入參數。進入過程體後首先輸出結果1為「張三」,此時參數cusname為輸出參數;然後通過查詢將客戶ID為2的客戶姓名再次傳遞給cusname,來改變它的值,此時它同樣為輸出參數,只是輸出結果發生了改變。
以上就是三個參數的用法,建議:
本文轉載自微信公眾號「SQL資料庫開發」,作者丶平凡世界。