快速入門
理解:
迄今為止,我們學過的大多數SQL語句都是針對一個或多個表的單條語句。但是並不是所有的操作都是可以用一條語句來完成的,經常有一些操作是需要多條語句配合才能完成。我們引入的存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集,經編譯后存儲在數據庫中,用戶通過指定存儲過程的名字並給定參數(如果該存儲過程帶有參數)來調用執行它。
簡單來說,存儲過程就是為以后使用而保存的一條或多條SQL語句。可將其視為增強版的批處理文件。
使用存儲過程的好處:
☐ 通過把處理封裝在一個易用的單元中,可以簡化復雜的操作。
☐ 不需要反復建立一系列的處理步驟,因而保證了數據的一致性。
☐ 簡化了對變動的管理,這一點的延伸就是安全性。
☐ 存儲過程通常以編譯過的形式存儲,所以DBMS處理命令所需的工作量少,提高了性能。
創建:
創建語句:
一般形式:
CREATE PROCEDURE([[IN |OUT |INOUT ] 參數名 數據類形...])
說明:
DELIMITER $$ DELIMITER; 用來定義分隔符,因為MySQL默認以";"為分隔符,如果我們沒有聲明分割符,那么編譯器會把存儲過程當成SQL語句進行處理,則存儲過程的編譯過程會報錯,所以要事先用DELIMITER關鍵字申明當前段分隔符,這樣MySQL才會將";"當做存儲過程中的代碼,不會執行這些代碼,用完了之后要把分隔符還原。
調用:
示例:
說明:
CALL Avg_Price(); 執行剛創建的存儲過程並顯示返回的結果。因為存儲過程實際上是一種函數,所以存儲過程名后需要有 () 符號(即使不傳遞參數也需要)。
刪除:
說明:請注意只給出了存儲過程名,並沒有書寫()。
使用參數
說明
在上面我們簡單地顯示SELECT語句的結果,一般存儲過程並不顯示結果,而是把結果返回給你指定的變量。
現在我們需求如下:
計算商品的最低,最高和平均價格,並保存到三個變量中。
創建存儲過程
調用此存儲過程
使用IN參數傳入條件
創建存儲過程:
調用存儲過程:
更加智能的存儲過程
說明:
迄今為止使用的所有存儲過程基本上都是封裝MySQL簡單的 SELECT語句。雖然它們全都是有效的存儲過程例子,但它們所能完成的工作你直接用這些被封裝的語句就能完成(如果說它們還能帶來更多的東西,那就是使事情更復雜)。只有在存儲過程內包含業務規則和智能處理時,它們的威力才真正顯現出來,來使我們的語句執行更加可靠和智能,比如我們可以聲明局部變量、添加內部注釋、使用循環或判斷語句等等。
實例:
常用控制語句及示例
強調:這里部分內容參考自王者佳暮 的新浪博客。
(1). 條件語句
Ⅰ. if-then -else語句
mysql > DELIMITER // mysql > CREATE PROCEDURE proc2(IN parameter int) -> begin -> declare var int; -> set var=parameter+1; -> if var=0 then -> insert into t values(17); -> end if; -> if parameter=0 then -> update t set s1=s1+1; -> else -> update t set s1=s1+2; -> end if; -> end; -> // mysql > DELIMITER ;
Ⅱ. case語句:
mysql > DELIMITER // mysql > CREATE PROCEDURE proc3 (in parameter int) -> begin -> declare var int; -> set var=parameter+1; -> case var -> when 0 then -> insert into t values(17); -> when 1 then -> insert into t values(18); -> else -> insert into t values(19); -> end case; -> end; -> // mysql > DELIMITER ;
(2). 循環語句
Ⅰ. while ···· end while:
mysql > DELIMITER // mysql > CREATE PROCEDURE proc4() -> begin -> declare var int; -> set var=0; -> while var<6 do -> insert into t values(var); -> set var=var+1; -> end while; -> end; -> // mysql > DELIMITER ;
Ⅱ. repeat···· end repeat:
它在執行操作后檢查結果,而while則是執行前進行檢查。
mysql > DELIMITER // mysql > CREATE PROCEDURE proc5 () -> begin -> declare v int; -> set v=0; -> repeat -> insert into t values(v); -> set v=v+1; -> until v>=5 -> end repeat; -> end; -> // mysql > DELIMITER ;
Ⅲ. loop ·····end loop:
loop循環不需要初始條件,這點和while 循環相似,同時和repeat循環一樣不需要結束條件, leave語句的意義是離開循環。
mysql > DELIMITER // mysql > CREATE PROCEDURE proc6 () -> begin -> declare v int; -> set v=0; -> LOOP_LABLE:loop -> insert into t values(v); -> set v=v+1; -> if v >=5 then -> leave LOOP_LABLE; -> end if; -> end loop; -> end; -> // mysql > DELIMITER ;
Ⅳ. LABLES 標號:
標號可以用在begin repeat while 或者loop 語句前,語句標號只能在合法的語句前面使用。可以跳出循環,使運行指令達到復合語句的最后一步。
(3). ITERATE迭代
Ⅰ. ITERATE:
通過引用復合語句的標號,來從新開始復合語句
mysql > DELIMITER // mysql > CREATE PROCEDURE proc10 () -> begin -> declare v int; -> set v=0; -> LOOP_LABLE:loop -> if v=3 then -> set v=v+1; -> ITERATE LOOP_LABLE; -> end if; -> insert into t values(v); -> set v=v+1; -> if v>=5 then -> leave LOOP_LABLE; -> end if; -> end loop; -> end; -> // mysql > DELIMITER ;