三,储存过程(2)

来源:互联网 发布:.xyz域名查询 编辑:程序博客网 时间:2024/04/29 03:04

1,MySQL的IF语句

IF expression THEN    statements;END IF;

IF中的表达式要返回TRUE,FALSE,NULL其中一个,如果表达式的执行结果是TRUE,则THEN后面的语句才能够被执行。要不然会跳过执行语句,直接到END IF。
执行流程:
这里写图片描述

1.1,MySQL的IF ELSE

IF expression THEN   statements;ELSE   else-statements;END IF;

执行流程:
这里写图片描述

1.2,MySQL的IF ELSEIF ELSE

IF expression THEN   statements;ELSEIF elseif-expression THEN   elseif-statements;...ELSE   else-statements;END IF;

执行流程:
这里写图片描述

1.3,程序实例

业务流程是从客户表中查找出客户的积分,然后根据客户的积分来判别客户的等级:白金会员,黄金会员,白银会员。
这里写图片描述
调用结果:
这里写图片描述
这里写图片描述

2,MySQL的CASE语句

2.1,简单的CASE语句

CASE  case_expression   WHEN when_expression_1 THEN commands   WHEN when_expression_2 THEN commands   ...   ELSE commandsEND CASE;

示例程序:

DELIMITER //CREATE PROCEDURE GetCustomerShipping( in  p_customerNumber int(11),  out p_shiping        varchar(50))BEGIN    DECLARE customerCountry varchar(50);    SELECT country INTO customerCountry FROM customers WHERE customerNumber = p_customerNumber;    CASE customerCountry WHEN  'USA' THEN    SET p_shiping = '2-day Shipping'; WHEN 'Canada' THEN    SET p_shiping = '3-day Shipping'; ELSE    SET p_shiping = '5-day Shipping'; END CASE;END//

调用结果:
这里写图片描述
这里写图片描述
运行流程:
这里写图片描述

2.2,搜索式CASE语句

CASE    WHEN condition_1 THEN commands    WHEN condition_2 THEN commands    ...    ELSE commandsEND CASE;

示例程序:
这里写图片描述
调用结果:

CALL GetCustomerLevel2(496,@p_level);SELECT @p_level;

这里写图片描述

3,CASE语句 VS IF语句

  • 当用单个的表达式和一串不同的数据比较时,简单的CASE语句比IF语句更加具有可读性。另外简单的CASE语句的执行效率也是好于IF语句的。
  • 当检查基于多个数值的复杂表达式时,IF语句比较容易理解。
  • 如果选择了CASE语句,你要确保CASE语句中至少要有一个要匹配。要不然,要写上错误处理来捕捉错误。
  • 有些时候,IF和CASE的混合可以使储存过程编程更加具有可读性和效率性。

4,循环语句

MySQL的循环语句包括WHILE,REPEAT,LOOP

4.1,WHILE

WHILE expression DO   statementsEND WHILE

WIHILE执行流:
这里写图片描述
示例程序:
这里写图片描述
调用结果:
这里写图片描述

4.2,REPEAT

REPEAT statements;UNTIL expressionEND REPEAT

执行流程:
这里写图片描述
示例程序:
这里写图片描述

4.3,LEAVE和ITERATE

控制循环的两种方式:LEAVE和ITERATE

  • LEAVE语句可以让你立即退出循环,而无需等待检查条件。相当于JAVA中的break;
  • 该ITERATE语句可以跳过它下面的整个代码,并开始新的迭代。相当于JAVA中的CONTINUE。
示例代码:![这里写图片描述](http://img.blog.csdn.net/20160826113055936)#5,游标##5.1,游标概述在处理储存过程里的结果集需要使用游标。游标可以让你通过查询的方式迭代一组返回回来的结果集,从而处理每一行数据。游标是只读的,不可滚动,敏感未定型的。
  • 只读的:你无法通过游标更新在基础表中的数据。
  • 不可滚动的:你只能在SELECT语句确定的顺序读取行。你不能在相反的顺序读取行。此外,你不能跳过行或跳转到特定行的结果集。
  • 敏感未定型的:有两种游标:敏感性未定型游标和不敏感游标。敏感性未定型游标指向实际数据,而一个不敏感游标使用的数据的临时副本。因为敏感性未定型游标没有进行数据的临时副本,所以敏感性未定型游标的性能比不敏感游标更快。从其他连接中对当前使用敏感未定型的游标的数据进行更新,会影响到数据

游标可以在储存过程,储存函数和触发器中使用。

5.2,游标的使用

声明游标:

DECLARE cursor_name CURSOR FOR SELECT_statement;

游标声明必须是任何变量声明之后。如果你之前的变量声明声明游标,MySQL将发出一个错误。游标必须始终与SELECT语句相关联。接下来,通过使用OPEN语句打开游标。 OPEN语句初始化的结果光标设置,因此,必须从结果集中提取行之前调用OPEN语句。

OPEN cursor_name;
然后,使用FETCH语句检索下一行光标所指,并将光标移动到下一行的结果集。
FETCH cursor_name INTO variables list;
最后,调用CLOSE语句如下停用光标,并释放与其相关的内存:
CLOSE cursor_name;
当使用MySQL游标时,还必须声明NOT FOUND处理程序来处理,当游标找不到任何行的情况。因为每次调用的时候FETCH语句,试图读取下一行的结果集。当到达结果集的结束,这将无法获得数据。该处理器是用来处理这种情况。
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
其中,finished是一个变量,以指示光标已到达该结果集的末尾。注意,处理程序声明必须在存储过程中的变量和游标声明之后出现。完整程序示例:
DELIMITER //CREATE PROCEDURE build_email_list (INOUT email_list VARCHAR(4000))BEGIN DECLARE v_finished INTEGER DEFAULT 0;        DECLARE v_email VARCHAR(100) DEFAULT ""; -- declare cursor for employee email DECLARE email_cursor CURSOR FOR  SELECT email FROM employees; -- declare NOT FOUND handler DECLARE CONTINUE HANDLER         FOR NOT FOUND SET v_finished = 1; OPEN email_cursor; get_email: LOOP FETCH email_cursor INTO v_email; IF v_finished = 1 THEN  LEAVE get_email; END IF; -- build email list SET email_list = CONCAT(v_email,";",email_list); END LOOP get_email; CLOSE email_cursor;END//DELIMITER ;

程序调用:

SET @email_list = "";CALL build_email_list(@email_list);SELECT @email_list;
0 0