您的位置:首页 > 数据库 > MySQL

三,储存过程(2)

2016-08-26 10:45 387 查看

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 commands
END 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 commands
END 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
statements
END WHILE


WIHILE执行流:



示例程序:



调用结果:



4.2,REPEAT

REPEAT
statements;
UNTIL expression
END REPEAT


执行流程:



示例程序:



4.3,LEAVE和ITERATE

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

LEAVE语句可以让你立即退出循环,而无需等待检查条件。相当于JAVA中的break;

该ITERATE语句可以跳过它下面的整个代码,并开始新的迭代。相当于JAVA中的CONTINUE。

示例代码:
![这里写图片描述](https://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_fini
4000
shed = 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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息