MySQL-5.7 高階語法及流程控制


1.標簽語句

[begin_label:] BEGIN
    [statement_list]
END [end_label]

[begin_label:] LOOP
    statement_list
END LOOP [end_label]

[begin_label:] REPEAT
    statement_list
UNTIL search_condition
END REPEAT [end_label]

[begin_label:] WHILE search_condition DO
    statement_list
END WHILE [end_label]
  • 標簽label可以加在begin...end語句以及loop,repeat和while語句上
  • 語句中通過iterate和leave來控制流程,iterate表示返回指定標簽位置,leave表示跳出標簽

實例:

mysql> delimiter //
mysql> create procedure doiterate(in p1 int,out p2 int)
    -> begin
    -> label1:loop
    -> set p1 = p1 + 1;
    -> if p1 < 10 then iterate label1;end if;
    -> leave label1;
    -> end loop label1;
    -> set p2=p1;
    -> end//
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

mysql> call doiterate(1,@a);
Query OK, 0 rows affected (0.00 sec)

mysql> select @a;
+------+
| @a   |
+------+
|   10 |
+------+
1 row in set (0.00 sec)

mysql> call doiterate(5,@a);
Query OK, 0 rows affected (0.00 sec)

mysql> select @a;
+------+
| @a   |
+------+
|   10 |
+------+
1 row in set (0.00 sec)

2.Declare語句

語法:

DECLARE var_name [, var_name] ...  type [DEFAULT value]
  • Declare語句通常聲明本地變量、游標、條件或者handler
  • Declare語句只允許出現在begin...end語句中而且必須出現在第一行
  • Declare的順序也有要求,通常是先聲明本地變量,再是游標,然后是條件和handler
  • 使用default指定變量的默認值,如果沒有指定默認值則為NULL
  • 聲明的變量和被引用的數據表中的字段要區分開

存儲過程中的變量

  • 本地變量可以通過declare語句聲明
  • 聲明后的變量可以通過select...into var_list進行賦值,或者通過set語句賦值,或者通過定義游標並使用fetch...into var_list賦值
mysql> delimiter //
mysql> create procedure sp1(v_sid int)
    -> begin
    -> declare xname varchar(64) default 'bob';
    -> declare xgender int;
    -> select sname,gender into xname,xgender from students where sid=v_sid;
    -> select xname,xgender;
    -> end//
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;
mysql> 
mysql> call sp1(1);
+--------+---------+
| xname  | xgender |
+--------+---------+
| Andrew |       1 |
+--------+---------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

3.流程控制語句

(1)case語句
在存儲過程或函數中表明復雜的條件選擇語句。
語法:

CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list] ...
    [ELSE statement_list]
END CASE

Or:

CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE

說明:

  • case_value與when_value依次做相等對比,如果相等則執行對應的后面的SQL語句,否則接着對比;
  • 當search_condition滿足true/1的結果時,則執行對應的SQL語句,否則執行else對應的SQL語句;

實例:

mysql> delimiter //
mysql> create procedure exp_case(v_sid int)
    -> begin
    -> declare v int default 1;
    -> select gender into v from students where sid=v_sid;
    -> case v
    -> when 0 then update students set gender=1 where sid=v_sid;
    -> when 1 then update students set gender=0 where sid=v_sid;
    -> else
    -> update students set gender=-1 where sid=v_sid;
    -> end case;
    -> end//
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> 
mysql> select * from students where sid=1;
+-----+--------+--------+---------+
| sid | sname  | gender | dept_id |
+-----+--------+--------+---------+
|   1 | Andrew | 1      |       1 |
+-----+--------+--------+---------+
1 row in set (0.00 sec)

mysql> call exp_case(1);
Query OK, 1 row affected (0.03 sec)

mysql> select * from students where sid=1;
+-----+--------+--------+---------+
| sid | sname  | gender | dept_id |
+-----+--------+--------+---------+
|   1 | Andrew | 0      |       1 |
+-----+--------+--------+---------+
1 row in set (0.00 sec)

另一種寫法:
mysql> delimiter //
mysql> create procedure exp_case2(v_sid int)
    -> begin
    -> declare v int default 1;
    -> select gender into v from students where sid=v_sid;
    -> case
    -> when v=0 then update students set gender=1 where sid=v_sid;
    -> when v=1 then update students set gender=0 where sid=v_sid;
    -> else
    -> update students set gender=-1 where sid=v_sid;
    -> end case;
    -> end//
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

mysql> call exp_case2(1);
Query OK, 1 row affected (0.03 sec)

mysql> select * from students where sid=1;
+-----+--------+--------+---------+
| sid | sname  | gender | dept_id |
+-----+--------+--------+---------+
|   1 | Andrew | 1      |       1 |
+-----+--------+--------+---------+
1 row in set (0.00 sec)

(2)IF語句
在存儲過程或函數中表明基礎的條件選擇語句
語法:

IF search_condition THEN statement_list
    [ELSEIF search_condition THEN statement_list] ...
    [ELSE statement_list]
END IF
  • 如果search_condition滿足true/1的條件,則執行對應的SQL語句,否則再判斷elseif中的search_condition,都不滿足則執行else中的SQL語句;
  • statement_list中可以包含一個或多個SQL語句

實例:

mysql> delimiter //
mysql> create function SimpleCompare(n int,m int)
    -> returns varchar(20)
    -> begin
    -> declare s varchar(20);
    -> if n > m then set s = '>';
    -> elseif n = m then set s = '=';
    -> else set s = '<';
    -> end if;
    -> set s = concat(n,'',s,'',m);
    -> return s;
    -> end//
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> 
mysql> select SimpleCompare(5,6);
+--------------------+
| SimpleCompare(5,6) |
+--------------------+
| 5<6                |
+--------------------+
1 row in set (0.00 sec)

mysql> select SimpleCompare(15,34);
+----------------------+
| SimpleCompare(15,34) |
+----------------------+
| 15<34                |
+----------------------+
1 row in set (0.00 sec)

mysql> select SimpleCompare(78,78);
+----------------------+
| SimpleCompare(78,78) |
+----------------------+
| 78=78                |
+----------------------+
1 row in set (0.00 sec)

IF嵌套:

mysql> delimiter //
mysql> create function verboseCompare(n int,m int)
    -> returns varchar(50)
    -> begin
    -> declare s varchar(50);
    -> if n = m then set s = 'equals';
    -> else
    -> if n > m then set s = 'greater';
    -> else set s = 'less';
    -> end if;
    -> set s = concat('is',s,'than');
    -> end if;
    -> set s = concat(n,'',s,'',m,'.');
    -> return s;
    -> end//
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> select verboseCompare(4,5);
+---------------------+
| verboseCompare(4,5) |
+---------------------+
| 4islessthan5.       |
+---------------------+
1 row in set (0.00 sec)

(3)iterate語句
僅出現在loop,repeat,while循環語句中,表示重新開始此循環。
語法:

ITERATE label

(4)leave語句
表明指定標簽的流程控制語句塊,通常用在begin...end,以及loop,repeat,while循環匯總;

LEAVE label

實例:

mysql> delimiter //
mysql> create procedure doiterate2(in p1 int,out p2 int)
    -> begin
    -> label1:loop
    -> set p1=p1+1;
    -> if p1 < 10 then iterate label1;end if;
    -> leave label1;
    -> end loop label1;
    -> set p2=p1;
    -> end//
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

(5)loop語句
在存儲過程或函數中表達循環執行的一種方式;
語法:

[begin_label:] LOOP
    statement_list
END LOOP [end_label]

實例:

mysql> delimiter //
mysql> create procedure doiterate3(p1 int)
    -> begin
    -> label1:loop
    -> set p1=p1+1;
    -> if p1<10 then iterate label1;end if;
    -> leave label1;
    -> end loop label1;
    -> set @x=p1;
    -> end//
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

(6)repeat語句
在存儲過程或函數中表達循環執行的一種方式;
語法:

[begin_label:] REPEAT
    statement_list
UNTIL search_condition
END REPEAT [end_label]

實例:

mysql> delimiter //
mysql> create procedure doiterate4(p1 int)
    -> begin
    -> set @x=0;
    -> repeat
    -> set @x=@x+1;
    -> until @x>p1 end repeat;
    -> end//
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> call doiterate4(1000);
Query OK, 0 rows affected (0.02 sec)

mysql> select @x;
+------+
| @x   |
+------+
| 1001 |
+------+
1 row in set (0.00 sec)

(7)while語句
在存儲過程或函數中表達循環執行的一種方式;
語法:

[begin_label:] WHILE search_condition DO
    statement_list
END WHILE [end_label]
  • 當search_condition返回true時,循環執行SQL語句,直到search_condition為false;

實例:

mysql> delimiter //
mysql> create procedure dowhile()
    -> begin
    -> declare v1 int default 5;
    -> while v1>0 do
    -> update students set gender=-1 where sid=v1;
    -> set v1=v1-1;
    -> end while;
    -> end//
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> call dowhile();
Query OK, 1 row affected (0.63 sec)

mysql> select * from students;
+-----+--------+--------+---------+
| sid | sname  | gender | dept_id |
+-----+--------+--------+---------+
|   1 | Andrew | -1     |       1 |
|   2 | Andy   | -1     |       1 |
|   3 | Bob    | -1     |       1 |
|   4 | Ruth   | -1     |       2 |
|   5 | Mike   | -1     |       2 |
|   6 | John   | 0      |       3 |
|   7 | Cindy  | 1      |       3 |
|   8 | Susan  | 1      |       3 |
+-----+--------+--------+---------+
8 rows in set (0.00 sec)

(8)return語句
在函數中,用來終結函數的執行並將指定值返回給調用者;
語法:

RETURN expr
  • 在函數中必須有至少一個return語句,當有多個return語句時則表明函數有多種退出方式;

實例:

mysql> delimiter //
mysql> create function doreturn()
    -> returns int
    -> begin
    -> select gender into @a from students where sid = 1;
    -> if @a=1 then return 1;
    -> elseif @a=0 then return 0;
    -> else return 999;
    -> end if;
    -> end//
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> select doreturn();
+------------+
| doreturn() |
+------------+
|        999 |
+------------+
1 row in set (0.00 sec)

mysql> select * from students where sid = 1;
+-----+--------+--------+---------+
| sid | sname  | gender | dept_id |
+-----+--------+--------+---------+
|   1 | Andrew | -1     |       1 |
+-----+--------+--------+---------+
1 row in set (0.00 sec)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM