zoukankan      html  css  js  c++  java
  • 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代表上面的变量
    
  • 相关阅读:
    anaconda在公司内网如何避免安装过程中HTTP0的错误?(windows)
    tensorflow视频学习笔记
    RNN,LSTM,SRNN,Long Short-Term Memory as a Dynamically Computed Element-wise Weighted Sum
    全国大学生数学建模竞赛广东省分赛 A题 CT系统参数标定及成像 方法总结
    elasticsearch
    crawler
    【英语学习】 第39天翻译练习之办公室环境
    【英语学习】第三周翻译练习之出国留学
    【英语学习】第二周翻译练习之网上购物
    【英语学习】第一周翻译练习之博物馆
  • 原文地址:https://www.cnblogs.com/plf-Jack/p/11195091.html
Copyright © 2011-2022 走看看