MYSQL:基礎—存儲過程

快速入門

理解:

   迄今爲止,咱們學過的大多數SQL語句都是針對一個或多個表的單條語句。可是並非全部的操做都是能夠用一條語句來完成的,常常有一些操做是須要多條語句配合才能完成咱們引入的存儲過程(Stored Procedure)是一組爲了完成特定功能的SQL語句集,經編譯後存儲在數據庫中,用戶經過指定存儲過程的名字並給定參數(若是該存儲過程帶有參數)來調用執行它。
  簡單來講,存儲過程就是爲之後使用而保存的一條或多條SQL語句。可將其視爲加強版的批處理文件。   html

使用存儲過程的好處
  ☐ 經過把處理封裝在一個易用的單元中,能夠簡化複雜的操做。
  ☐ 不須要反覆創建一系列的處理步驟,於是保證了數據的一致性。
  ☐ 簡化了對變更的管理,這一點的延伸就是安全性。
  ☐ 存儲過程一般以編譯過的形式存儲,因此DBMS處理命令所需的工做量少,提升了性能。mysql

建立:

建立語句:sql

  

通常形式:數據庫

  CREATE PROCEDURE([[IN |OUT |INOUT ] 參數名 數據類形...])

說明:
  DELIMITER $$ DELIMITER; 用來定義分隔符,由於MySQL默認以";"爲分隔符,若是咱們沒有聲明分割符,那麼編譯器會把存儲過程當成SQL語句進行處理,則存儲過程的編譯過程會報錯,因此要事先用DELIMITER關鍵字申明當前段分隔符,這樣MySQL纔會將";"當作存儲過程當中的代碼,不會執行這些代碼,用完了以後要把分隔符還原。安全

調用:

示例:
  函數

說明:oop

  CALL Avg_Price(); 執行剛建立的存儲過程並顯示返回的結果。由於存儲過程其實是一種函數,因此存儲過程名後須要有 () 符號(即便不傳遞參數也須要)性能

刪除:

  


說明:spa

  請注意只給出了存儲過程名,並無書寫()。code

使用參數

說明  

  在上面咱們簡單地顯示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 ;
複製代碼
相關文章
相關標籤/搜索