MYSQL存储过程(二)

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.sal
        from emp e,dept d
        where e.deptno = d.deptno and 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 is true 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 not begin with '00', '01', or '02'.

-- 各种写法:
    DECLARE exit HANDLER FOR SQLSTATE '42S01' set @res_table = 'EXISTS';
    DECLARE continue HANDLER FOR 1050 set @res_table = 'EXISTS';
    DECLARE continue HANDLER FOR not found set @res_table = 'EXISTS';


上一篇:DNS服务的基本配置与多域配置


下一篇:linux进程管理