三,储存过程(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。
- 只读的:你无法通过游标更新在基础表中的数据。
- 不可滚动的:你只能在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
- 三,储存过程(2)
- 储存过程
- 储存过程
- 储存过程
- 储存过程
- mysql 储存过程的特点 (翻译)
- SQL储存过程(增删改查)
- Android数据之SQLiteDatabse储存(三)
- 储存过程实现分页
- 储存过程实例
- oracl储存过程例子
- 分页储存过程
- 储存过程操作类
- 分页储存过程
- c# winfrom 储存过程
- C# 储存过程
- 数据库新建储存过程
- mysql储存过程
- 静态库.a的制作,或framework的制作
- HTTP状态码(HTTP Status Code)
- 【转载】MySQL数据库迁移详细步骤
- PageHelper分页插件使用
- PHP中include和require的区别详解
- 三,储存过程(2)
- 2016夏季练习
- sql server 2008 r2附加数据库时出现-无法显示请求的对话框的解决方案
- 关于Ajax使用的总结
- leetcode90:Subsets II
- 行转列之decode、case when
- Callable、Future、FutureTask 分析
- [SCOI2007]蜥蜴
- CSS text-fill-color属性