mysql - 流程控制

順序結構java

分支結構sql

循環結構oop

 

 

分支結構:ui

1. if    spa

if(表達式1,表達式2,表達式3)指針

若是:表達式1 = true,則執行表達式2;調試

若是:表達式1 = false,則執行表達式3;code

SET @a = 2;

SELECT IF(@a = 3,NAME,money) FROM account WHERE userid = 1;

 

if 條件blog

    then 語句it

else

    語句

end if;

 

2.case

1.相似於switch case結構

case 變量(或表達式)

when 值1 then 語句;

when 值2 then 語句;

。。。

else 語句;

end case;

DELIMITER $$
CREATE PROCEDURE pro_test1(IN a INT)
BEGIN 
    SET @a = a;
    CASE @a
        WHEN 1 THEN SELECT 'A';
        WHEN 2 THEN SELECT 'B';
        WHEN 3 THEN SELECT 'C';
        ELSE SELECT 'D';
    END CASE;
END $$
DELIMITER ;

CALL pro_test1(2);

 

2.相似於if else結構

case

when 條件1 then 語句;

when 條件2 then 語句;

。。。

else 語句;

end case;

DELIMITER $$
CREATE PROCEDURE pro_test2(IN a INT)
BEGIN 
    SET @a = a;
    CASE 
        WHEN @a = 1 THEN SELECT 'A';
        WHEN @a = 2 THEN SELECT 'B';
        WHEN @a = 3 THEN SELECT 'C';
        ELSE SELECT 'D';
    END CASE;
END $$
DELIMITER ;

CALL pro_test1(2);

else至關於java中的default,能夠省略,若是都不符合返回null。

 

 

循環結構

while                 java中的while                                     while 循環條件 do 語句; end while;

loop                  java中的while(true)                            須要利用leave來中止

repeat              java中的do while                                 repeat 語句 until 中止條件 end repeat

interate            java中的continue                                跳過此次循環,進入下一次循環

leave               java中的break                                     結束當前循環  最好後面加上循環的標識名字= =個人 sqlyog 不加循環名字會報錯。。。

 

 

用循環作乘積

num1 個 num2 相加返回 result

1.while

DELIMITER $$
CREATE PROCEDURE pro_test_while(IN num1 INT, IN num2 INT, OUT result INT)
BEGIN
    DECLARE i INT;
    SET i = 0;
    SET result = 0;
    
    WHILE i < num1 DO
        SET i = i + 1;
        SET result = result + num2;
    END WHILE;
END $$
DELIMITER ;

CALL pro_test_while(12,13,@re);
SELECT @re;

 

2. loop

DELIMITER $$
CREATE PROCEDURE pro_test_loop(IN num1 INT, IN num2 INT, OUT result INT)
BEGIN
    DECLARE i INT;
    SET i = 0;
    SET result = 0;
    
    l1: LOOP
        IF i = num1 
            THEN LEAVE l1;
        ELSE
            SET i = i + 1; 
            SET result = result + num2;
        END IF;
    END LOOP l1;
END $$
DELIMITER ;


CALL pro_test_loop(12,13,@re);
SELECT @re;

 

3.repeat

DELIMITER $$
CREATE PROCEDURE pro_test_repeat(IN num1 INT, IN num2 INT, OUT result INT)
BEGIN
    DECLARE i INT;
    SET i = 0;
    SET result = 0;
    
    REPEAT
        SET i = i + 1; 
        SET result = result + num2;
    UNTIL i = num1
    END REPEAT;
END $$
DELIMITER ;


CALL pro_test_repeat(12,13,@re);
SELECT @re;

 

 

遊標:

相似於java中的指針 和 foreach(Object o: ArrayList<Object> arr) 中的o

DELIMITER $$
CREATE PROCEDURE pro_test_cursor(IN p_uid1 INT, IN p_uid2 INT, OUT p_result VARCHAR(400))
BEGIN
    DECLARE p_uid INT;    
    DECLARE p_uname VARCHAR(20);     
    DECLARE p_done INT DEFAULT 0;   
    DECLARE p_c CURSOR FOR SELECT uid, username FROM userinfo; #定義遊標c,c每次表示了查詢結果中的一行結果。
    
    
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET p_done=1;       
    SET p_result = 'aaa';            
    
    OPEN p_c; #打開遊標

    SELECT p_done, p_uid, p_uid1, p_uid2;    #執行到這裏時輸出查詢結果,能夠用來調試bug    
    
    l1: LOOP
        FETCH p_c INTO p_uid, p_uname;  
        #把當前遊標指向的這一條結果賦給變量進行處理,同時遊標會挪到下一行。所以須要在這句執行完後判斷done = 1,不然最後一條會多處理一遍。
        #以前用uid做爲變量名,發現會致使uid = null。可能不能和屬性名同樣。
        
        IF p_done = 1 
            THEN LEAVE l1;
        END IF;  #當done = 1時,說明已經找到了最後,直接leave  
        
        #沒有leave時,進行判斷和處理
        IF p_uid = p_uid1 OR p_uid = p_uid2 THEN
            SET p_result = CONCAT(p_result, '|', p_uname);
        END IF;
    END LOOP l1;
    CLOSE p_c; #關閉遊標
    
END $$
DELIMITER ;


CALL pro_test_cursor(2,8,@re);
SELECT @re;
相關文章
相關標籤/搜索