1. 程式人生 > >IF,CASE,LOOP,LEAVE,ITERATE,REPEAT,WHILE流程控制語句

IF,CASE,LOOP,LEAVE,ITERATE,REPEAT,WHILE流程控制語句

1. 流程控制概要

流程控制語句在函式或儲存過程中,以及使用遊標時十分常用。

主要包括:

IF,CASE,LOOP,LEAVE,ITERATE,REPEAT,WHILE

******IF語句

IF實現條件判斷,滿足不同的條件走不同的語句,與程式語言中邏輯一樣,不同的是通過END IF結算判斷。

語法:

IF search_condition THEN statement_list

        [ELSEIF search_condition THEN statement_list]......

        [ELSE statement_list]

END IF

******CASE語句

函式和儲存過程中的case語句與sql語句中的case不同之處在於函式或儲存過程中結束時多了個case

語法:

CASE

        WHEN search_condition THEN statement_list

       [ WHEN search_condition THEN statement_list]......

       [ELSE statment_list]

END CASE

CASE case_value

      WHEN  when_value THEN statement_list

      [WHEN when_value THEN statement_list]......

     [ELSE statement_list]

END CASE

******LOOP語句

LOOP實現迴圈,退出迴圈通常用LEAVE語句實現,否則出現死迴圈。

語法:

[begin_label:] LOOP

      statement_list

END LOOP [end_label]

******LEAVE語句

流程退出語法,一般和迴圈一起使用,比如loop。

******ITERATE語句

必須用在迴圈中,作用是跳出當前的迴圈,往下執行,進行下一輪的迴圈,與程式語言中的continue跳過當前迴圈含義一樣。

******REPEAT語句

有條件的迴圈控制語句,當滿足什麼條件的時候退出迴圈。

語法:

[begin_label:]REPEAT

       statement_list

UNTIL search_condition

END REPEAT[end_label]

其中UNTIL為控制迴圈退出的地方,until英文意思是:直到....才...,也就是說,直到滿足search_condition條件,迴圈才退出。

******WHILE語句

有條件的迴圈控制語句,滿足條件進入迴圈,否則退出迴圈。

語法:

[begin_label:] WHILE search_conditon DO

        statement_list

END WHILE [end_label]

2. 例項準備條件

建立表:

CREATE TABLE `t_user_main` (
  `f_userId` int(10) NOT NULL AUTO_INCREMENT COMMENT '使用者id,作為主鍵',
  `f_userName` varchar(5) DEFAULT NULL COMMENT '使用者名稱',
  `f_age` int(3) DEFAULT NULL COMMENT '年齡',
  PRIMARY KEY (`f_userId`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

插入資料:

INSERT INTO t_user_main (f_userName, f_age) 
VALUES('one',24),('two',25),('three',26),('four',27),('five',28),('six',29);

3. 流程控制綜合例項

在函式和儲存過程中一樣使用,這裡採用儲存過程分析。

eg1:

DELIMITER $$
CREATE PROCEDURE user_main_pro(IN v_id INT,OUT v_count INT)
BEGIN
  #宣告變數
  DECLARE v_age INT(11);
  DECLARE v_userId INT(11);
  DECLARE v_sumage INT(11) DEFAULT 0;
  #宣告遊標
  DECLARE user_main_cr CURSOR FOR
  SELECT f_userId, f_age FROM t_user_main 
  WHERE f_userId > v_id ORDER BY f_userId;
  #開啟遊標
  OPEN user_main_cr;
  #FETCH遊標
  userMainLoop: LOOP
    FETCH user_main_cr INTO v_userId, v_age;
    IF v_userId < 5 THEN
       #SET賦值
       SET v_sumage = v_sumage + v_age;
    ELSEIF v_userId = 5 THEN
       #退出loop迴圈
       LEAVE userMainLoop;
    END IF;
  END LOOP userMainLoop;
  #關閉遊標
 CLOSE user_main_cr;
 #給out模式賦值
  SET v_count = v_sumage;
END $$
DELIMITER;
儲存過程成呼叫:

該示例用到了CURSOR遊標,IF判斷,LOOP迴圈,LEAVE退出LOOP迴圈。

eg2:

DELIMITER $$
CREATE PROCEDURE user_main_pro2(INOUT v_id INT)
BEGIN
  #宣告變數
  DECLARE v_userId, v_age, v_sumage INT(11) DEFAULT 0;
  #宣告遊標
  DECLARE user_main_cr CURSOR FOR
  SELECT f_userId, v_age FROM t_user_main
  WHERE f_userId > v_id ORDER BY f_userId;
  #開啟遊標
  OPEN user_main_cr;
  #FETCH遊標
  userMainRepeat: REPEAT
    FETCH user_main_cr INTO v_userId,v_age;
    #使用case控制語句流程
    CASE 
        WHEN v_userId = 1 THEN 
             SET v_sumage = v_sumage + v_age + 100;
        WHEN v_userId = 2 THEN
             SET v_sumage = v_sumage + v_age + 200;
        WHEN v_userId = 3 THEN
             SET v_sumage = v_sumage + v_age + 300;
        WHEN v_userId = 4 THEN
             SET v_sumage = v_sumage + v_age + 400;
        ELSE 
             SET v_sumage = v_sumage + v_age + 500;
    END CASE;
  UNTIL v_userId > 5
  END REPEAT userMainRepeat;
  #關閉遊標
  CLOSE user_main_cr;
  #INOUT模式給輸出模式賦值
  SET v_id = v_sumage;
END $$
DELIMITER;
儲存過程呼叫:

該過程用到CURSOR遊標,CASE條件判斷,REPEAT迴圈

eg3:

DELIMITER $$
CREATE PROCEDURE user_main_pro3(OUT v_sumage INT)
BEGIN
  #宣告變數
  DECLARE v_userId, v_age, v_s INT(11) DEFAULT 0;
  #宣告遊標
  DECLARE user_main_cr CURSOR FOR
  SELECT f_userId, f_age FROM t_user_main ORDER BY f_userId;
  #開啟遊標
  OPEN user_main_cr;
  #FETCH遊標
  FETCH user_main_cr INTO v_userId , v_age;
  userMainWhile:WHILE v_userId < 5 DO
    IF v_userId = 1 THEN
       SET v_s = v_s + v_age + 500;
    ELSE
       SET v_s = v_s + v_age + 1000;
    END IF;
    FETCH user_main_cr INTO v_userId , v_age;
  END WHILE userMainWhile;
  #關閉遊標
  CLOSE user_main_cr;
  #OUT模式賦值
  SET v_sumage = v_s;
END $$
DELIMITER;
儲存過程呼叫:

該過程用CURSOR遊標,IF判斷,WHILE迴圈。