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迴圈。