存储过程(二)流程控制语法 选择

来源:互联网 发布:淘宝客服没经验能干吗 编辑:程序博客网 时间:2024/06/05 18:16
MySQL支持的流程控制语法:(1)顺序 (2)选择 (3)循环

选择:IF语句,CASE语句

循环:LOOP语句,Leave语句,Iterate语句,Repeat语句,While语句.


(1)选择

存储过程的实例声明:(有注释)
CREATE PROCEDURE procedure1 /* name存储过程名*/
(IN parameter1 INTEGER) /* parameters 参数*/
BEGIN /* start of block 语句块头*/
DECLARE variable1 CHAR(10); /* variables 变量声明*/
IF parameter1= 17 THEN /* start of IF IF 条件开始*/
    SET variable1 = 'birds'; /* assignment 赋值*/
ELSE
    SET variable1 = 'beasts'; /* assignment 赋值*/
END IF; /* end of IF IF 结束*/
INSERT INTO table1 VALUES (variable1);/* statement SQL 语句*/
END /* end of block 语句块结束*/ 
触发器和存储过程的关联是必然的。 

Conditions and IF-THEN-ELSE 

IF语句语法:

  IF search_condition THEN statement_list

  [ELSEIF search_condition THEN statement_list] ...

  [ELSE statement_list]

  END IF


现在我们可以写一些包含条件式的例子:
CREATE PROCEDURE p12 (IN parameter1 INT)
BEGIN
DECLARE variable1 INT;
SET variable1 = parameter1 + 1;
IF variable1 = 0 THEN
INSERT INTO t VALUES (17);
END IF;
IF parameter1 = 0 THEN
UPDATE t SET s1 = s1 + 1;
ELSE
UPDATE t SET s1 = s1 + 2;
END IF;
END;
这里是一个包含 IF 语句的过程。里面有两个 IF 语句,一个是 IF 语句 END IF,另一个是 IF 语句 ELSE 语句 END IF。我们可以在这里使用复杂的过程,但我会尽量使其简单让你能更容易弄清楚。CALL p12 (0)我们调用这个过程,传入值为 0,这样 parameter1 的值将为 0。这里变量 variable1 被赋值为 parameter1 加 1 的值,所以执行后变量 variable1 为 1。因为变量 variable1 值为 1,因此条件"ifvariable1 = 0"为假,IF......END IF被跳过,没有被执行。到第二个 IF 条件,判断结果为真,于是中间语句被执行了因为参数 parameter1 值等于 0,UPDATE语句被执行。如果 parameter1 值为 NULL,则下一条 UPDATE 语句将被执行,现在表 t 中有两行,他们都包含值 5,所以如果我们调用 p12,两行的值会变成 6。
mysql> CALL p12(0)
Query OK, 2 rows affected (0.28 sec)
mysql> SELECT * FROM t
+------+
| s1 |
+------+
| 6 |
| 6 |
+------+
2 rows in set (0.01 sec)
结果也是我们所期望的那样。

CASE 指令

 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


CREATE PROCEDURE p13 (IN parameter1 INT)
BEGIN
DECLARE variable1 INT;
SET variable1 = parameter1 + 1;
CASE variable1
WHEN 0 THEN INSERT INTO t VALUES (17);
WHEN 1 THEN INSERT INTO t VALUES (18);
ELSE INSERT INTO t VALUES (19);
END CASE;
END;
如果需要进行更多条件真假的判断,我们可以使用 CASE 语句。CASE 语句使用和 IF 一样简单。我们可以参考上面的例子:
mysql> CALL p13(1)
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM t//
+------+
| s1 |
+------+
| 6 |
| 6 |
| 19 |
+------+
3 rows in set (0.00 sec)
执行过程后,传入值 1,如上面例子,值 19 被插入到表 t 中。
Question
问题: CALL p13(NULL) 的作用是什么?
另一个:这个 CALL 语句做了那些动作?
你可以通过执行后观察 SELECT 做了什么,也可以根据代码判断,在 5 秒内做出。
Answer
mysql> CALL p13(NULL)
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM t//
+------+
| s1 |
+------+
| 6 |
| 6 |
| 19 |
| 19 |
+------+
4 rows in set (0.00 sec)
答案是当你调用 p13 时,MySQL插入了另一条包含数值 19 的记录。原因是变量 variable1的值为 NULL,CASE 语句的 ELSE 部分就被执行了,希望这对大家有意义。





0 0
原创粉丝点击