01 存储过程
    存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql
02 三种开发模型
    1、
        应用程序:只需要开发应用程序的逻辑
        mysql:编写好存储过程,以供应用程序调用
        优点:开发效率,执行效率都高
        缺点:考虑到人为因素、跨部门沟通等问题,会导致扩展性差
    2、
        应用程序:除了开发应用程序的逻辑,还需要编写原生sql
        mysql:
        优点:比方式1,扩展性高(非技术性的)
        缺点:
            1、开发效率,执行效率都不如方式1
            2、编写原生sql太过于复杂,而且需要考虑到sql语句的优化问题
    3、
        应用程序:开发应用程序的逻辑,不需要编写原生sql,基于别人编写好的框架来处理数据,ORM
        mysql:
        优点:不用再编写纯生sql,这意味着开发效率比方式2高,同时兼容方式2扩展性高的好处
        缺点:执行效率连方式2都比不过
03 创建存储过程
delimiter $$
create procedure p1(
    in m int,
    in n int,
    out res int
)
begin
    select tname from teacher where tid > m and tid < n;
    set res=0;
end $$
delimiter ;
# 如何用存储过程
#1、直接在mysql中调用
set @res=10
call p1(2,4,10);
#查看结果
select @res;
#2、在python程序中调用
#3、事务的使用
delimiter //
create PROCEDURE p5(
    OUT p_return_code tinyint
)
BEGIN
    DECLARE exit handler for sqlexception
    BEGIN
        -- ERROR
        set p_return_code = 1;
        rollback;
    END;
    DECLARE exit handler for sqlwarning
    BEGIN
        -- WARNING
        set p_return_code = 2;
        rollback;
    END;
    START TRANSACTION;
        update user set balance=900 where id =1;
        update user123 set balance=1010 where id = 2;
        update user set balance=1090 where id =3;
    COMMIT;
    -- SUCCESS
    set p_return_code = 0; #0代表执行成功
END //
delimiter ;
delimiter //
create PROCEDURE p6(
    OUT p_return_code tinyint
)
BEGIN
    DECLARE exit handler for sqlexception
    BEGIN
        -- ERROR
        set p_return_code = 1;
        rollback;
    END;
    DECLARE exit handler for sqlwarning
    BEGIN
        -- WARNING
        set p_return_code = 2;
        rollback;
    END;
    START TRANSACTION;
        update user set balance=900 where id =1;
        update user set balance=1010 where id = 2;
        update user set balance=1090 where id =3;
    COMMIT;
    -- SUCCESS
    set p_return_code = 0; #0代表执行成功
END //
delimiter ;