MySql存儲過程—邏輯判斷,條件控制,循環控制

同編寫程序類似,存儲過程中也有對應的條件判斷,功能類似於if、switch。在MySql裏面對應的是IF和CASE

1、IF判斷

IF判斷的格式是這樣的:

  1. IF expression THEN commands  
  2.    [ELSEIF expression THEN commands]  
  3.    [ELSE commands]  
  4.    END IF;  
這裏expression是我們的判斷表達式;ELSE IF 和ELSE都是可選的;command就是當條件爲真(true爲1,false爲0)時執行的命令。比如我們設計一個存儲過程用於返回商品的價格,這裏價格通過傳入的參數來判斷是要帶稅收的價格還是沒有帶稅收的價格。先看看錶的數據:


然後下面是我們的存儲過程:


存儲過程的話有兩個輸入參數,第一個isTaxed表示是不是要帶稅價格,第二個是產品的名稱;在存儲過程裏面定義了兩個變量,finalPrice用來保存價格,而taxRate表示稅率。這裏代碼比較簡單,就是判斷下如果是要加稅,就把原來的價格乘上稅率。下面是測試結果:

true的情況表示是帶稅的價格。好了這個是使用IF的一個例子,下面看看CASE;

2、CASE的使用

同編程裏面的那個switch ....case.....類似,使用CASE同編程一樣也是當判斷比較多時便於閱讀和維護,我們也來看下CASE的語法:


下面我們假設不同類型的商品對應的稅收稅率是不一樣的情況來看個例子,這裏假設甜點的稅率是0.05,奶製品的是0.1,傢俱類的是0.2:,下面是存儲過程:



 

上面增加了一個保存產品類型的一個變量proType,用來保存商品類型。然後使用CASE來進行判斷來設置稅率,下面是測試的部分:

可以看到沙發的價格是1250*1.2=1500,而蛋糕的價格是10*1.05 = 10.5





在MySql的存儲過程中可使用的循環有三種:WHILE、REPEAT、LOOP

1、WHILE

WHILE的格式是這樣的:

  1. WHILE expression DO  
  2.    Statements  
  3. END WHILE  
下面是個例子

  1. DELIMITER $$  
  2.   
  3. DROP PROCEDURE IF EXISTS `test`.`WhileLoopProc` $$  
  4. CREATE PROCEDURE `test`.`WhileLoopProc` ()  
  5. BEGIN  
  6.  DECLARE x  INT;  
  7.  DECLARE str  VARCHAR(255);  
  8.  SET x = 1;  
  9.  SET str =  '';  
  10.  WHILE x  <= 5 DO  
  11.      SET  str = CONCAT(str,x,',');  
  12.      SET  x = x + 1;  
  13.  END WHILE;  
  14.  SELECT str;  
  15. END $$  
  16.   
  17. DELIMITER ;  
上面的例子最後輸出“1,2,3,4,5,”這樣的字符。

2、REPEAT

REPEAT的格式是這樣的:

  1. REPEAT  
  2. Statements;  
  3. UNTIL expression  
  4. END REPEAT  
REPEAT好比我們編程裏面的do...while一樣。這邊例子就不舉了,同上面的類似。

3、LOOP 及 LEAVE、ITERATE

這裏LOOP用來標記循環;而LEAVE表示離開循環,好比編程裏面的break一樣;ITERATE則繼續循環,類型與編程裏面的continue。

  1. DELIMITER $$  
  2.   
  3. DROP PROCEDURE IF EXISTS `test`.`LoopProc` $$  
  4. CREATE PROCEDURE `test`.`LoopProc` ()  
  5. BEGIN  
  6. DECLARE x  INT;  
  7. DECLARE str  VARCHAR(255);  
  8. SET x = 1;  
  9. SET str =  '';  
  10. loop_label:  LOOP  
  11.   IF  x > 10 THEN  
  12.    LEAVE  loop_label;  
  13.   END  IF;  
  14.   SET  x = x + 1;  
  15.   IF  (x mod 2) THEN  
  16.    ITERATE  loop_label;  
  17.   ELSE  
  18.    SET  str = CONCAT(str,x,',');  
  19.   END  IF;  
  20.   
  21. END LOOP;  
  22. SELECT str;  
  23. END $$  
  24.   
  25. DELIMITER ;  
上面代碼輸出10以內的偶數,用逗號分隔。這裏注意到x>10的時候就LEAVE掉,如果遇到奇數則ITERATE,奇數對2取模爲1,表示true
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章