1. 什么是存储过程
是任意的sql语句的组合,被放到某一个存储过程中,类似于一个函数,有一个函数,有参数,还是函数体
2. 为什么使用存储过程
包含任何的sql语句,逻辑处理,事务处理。所有的我们学过的sql都可以放到里面
3. 三种开发方式的对比
第一种:应用程序只关注业务逻辑,所有与数据相关的逻辑封装到mysql中
优点:应用程序要处理的事情变少了,可以减少网络传输
缺点:增加了人力成本和沟通成本,降低了开发效率
第二种:应用程序既要处理业务逻辑,还有自己编写sql语句
优点:降低了沟通成本,人力成本
缺点:网络传输增加,sql语句编写非常繁琐,易出错
第三种:通过ORM框架。对象关系映射,自动生成sql语句并执行
优点:简化编写sql语句的过程,提升了开发速度
缺点:不够灵活。数据库和应用程序开发者完全隔离,可能导致开发者仅关注上层开发,而不清楚底层原理
4. 如何使用存储过程
1. 语法
-----------创建--------
create procedure pro_name(p_Type p_name data_type)
begin
sql语句 ... 流程控制
end
-----------参数---------------
p_Type:
in 输入
out 输出
inout 输入输出
p_name参数的名字
data_type:参数的数据类型 如 int float
-----------删除----------------
drop procedure pro_name;
-----------查看----------------
show create procedure pro_name;
-----------查看某个库中的所有存储过程----------------
select name from mysql.proc where db = "库名" and type = "procedure";
select name from mysql.proc where db = "day41_1" and type = "procedure";
# 测试数据
create table account(id int primary key auto_increment,name char(10),money float);
insert into account values(null,"big",1000),(null,"dog",2000),(null,"cat",3000),(null,"me",0);
2. 示例
---------------------示例1-----------------------
delimiter //
create procedure plf(in a int,in b int,out c float)
begin
set c = a + b;
end //
delimiter ;
set @res = 0;# 设置变量
call plf(1,2,@res);# 调用该存储对象。ps:out类型的数据,在调用时必须给定变量。
---------------------示例2-----------------------
// 我们需要把将更新语句写错,同时让其自动触发一个异常报错,然后执行回滚操作
delimiter //
create procedure transfer(in aid int,in bid int,in m float,out p_return_code int)
begin
DECLARE exit handler for sqlexception
BEGIN
# ERROR
set p_return_code = 1;
rollback;
END;
# exit 也可以换成continue 表示发生异常时继续执行
DECLARE exit handler for sqlwarning
BEGIN
# WARNING
set p_return_code = 2;
rollback;
END;
# 事务执行
START TRANSACTION;
update account set money = money - m where id = aid;
# 故意将money字段写错,让其执行报错,从而执行上面的异常捕捉中的代码
update account set moneys = money + m where id = bid;
COMMIT;
# 如果成功,p_return_code为0
set p_return_code = 0;
end //
delimiter;
set @p_return_code = 10;// 需要提前设置变量
call transfer(1,2,100,@p_return_code);# 1,2分别为account表中对应的id,100为钱,@p_return_code代表上面的变量