1. 环境说明
MYSQL 5.6
2. 使用说明
存储过程时数据库的一个重要的对象,可以封装SQL语句集,可以用来完成一些较复杂的业务逻辑,并且可以入参出参(类似于java中的方法的书写)。创建时会预先编译后保存,用户后续调用不需要再次编译。
3. 优缺点
优点:
在生产环境下,可以通过直接修改存储过程的方式修改业务逻辑(或bug),而不用重启服务器。
执行速度快,存储过程经过编译之后会比单独一条一条执行要快。
减少网络传输流量。
方便优化。
缺点:
过程化编程,复杂业务处理的维护成本高。
调试不便,无法像JAVA一样断点调试
不同数据库之间可移植性差。(不同数据库语法不一致!)
4. 语法
官方参考网址
https://dev.mysql.com/doc/refman/5.6/en/sql-statements.html
https://dev.mysql.com/doc/refman/5.6/en/sql-compound-statements.html
- 语法结构
- 游标:用游标得到某一个结果集,逐行处理数据
类比jdbc的ResultSet -- 声明语法DECLARE cursor_name CURSOR FOR select_statement -- 打开语法OPEN cursor_name -- 取值语法FETCH cursor_name INTO var_name [, var_name] ... -- 关闭语法CLOSE cursor_name -- 需求:按照部门名称查询员工,通过select查看员工的编号、姓名、薪资。(注意,此处仅仅演示游标用法)delimiter $$ create procedure sp_create_table02(in dept_name varchar(32))begin declare e_no int; declare e_name varchar(32); declare e_sal decimal(7,2); declare lp_flag boolean default true; declare emp_cursor cursor for select e.empno,e.ename,e.salfrom emp e,dept d where e.deptno= d.deptnoand d.dname= dept_name;-- handler 句柄 declare continue handler for NOT FOUND set lp_flag =false; open emp_cursor; emp_loop:loop fetch emp_cursor into e_no,e_name,e_sal; if lp_flag then select e_no,e_name,e_sal; else leave emp_loop; end if; end loop emp_loop;set @end_falg ='exit_flag'; close emp_cursor;end$$ call sp_create_table02('RESEARCH');特别注意: 在语法中,变量声明、游标声明、handler声明是必须按照先后顺序书写的,否则创建存储过程出错。
- 存储过程中的handler
DECLARE handler_action HANDLER FOR condition_value [, condition_value] ... statement handler_action:{ CONTINUE | EXIT | UNDO }condition_value:{ mysql_error_code | SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING |NOT FOUND | SQLEXCEPTION }CONTINUE: Execution of the current program continues. EXIT: Execution terminates for the BEGIN ... END compound statement in which the handler is declared. This istrue even if the condition occurs in an inner block. SQLWARNING: Shorthand for the class of SQLSTATE values that begin with '01'. NOT FOUND: Shorthand for the class of SQLSTATE values that begin with '02'. SQLEXCEPTION: Shorthand for the class of SQLSTATE values that do notbegin with '00','01',or'02'. -- 各种写法: DECLARE exit HANDLER FOR SQLSTATE '42S01'set @res_table ='EXISTS'; DECLARE continue HANDLER FOR 1050set @res_table ='EXISTS'; DECLARE continue HANDLER FOR not found set @res_table ='EXISTS';