MySQL之存储过程

四:存储过程 (优先掌握)

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代表上面的变量
posted @ 2019-07-16 15:18  Hello_Jack  阅读(760)  评论(0编辑  收藏  举报
# 页脚html代码 /*头部导航栏*/ #navigator { font-size:15px; border-bottom: 1px solid #ededed; border-top: 1px solid #ededed; height: 60px;/*导航栏高度,原始50*/ clear: both; margin-top: 25px; } /*导航栏设置,可以自定义导航栏的目录*/ #navList { min-height: 35px; float: left; } #navList li { /*每一个栏目节点*/ float: left; margin: 0 5px 0 0; /*这里原来是0 40px 0 0 */ } #navList a { /*栏目文字的格式*/ display: block; width: 5em; height: 22px; float: left; text-align: center; padding-top: 19px; }