原创

mysql存储过程的使用详解

温馨提示:
本文最后更新于 2022年11月06日,已超过 535 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

哈喽我的宝,今天我们一起来学习一下存储过程,采用轻量级的数据库MySQL,如有错误欢迎大家留言指正。

今天主要采用存储过程来实现银行转账操作

一、定义/概念

存储过程简单来说就是将过程化SQL存储下来方便多次重复使用
过程化SQL突破了传统SQL的局限性,可以进行复杂的逻辑操作

基本结构

采用CREATE PROCEDURE关键字 后面节存储过程名称
所有的SQL和逻辑判断语句都写在BEGINEND 之间,就类似于我们在c语言中定义函数的花括号{}

CREATE PROCEDURE 存储过程名称()
  BEGIN
      这里写业务逻辑和SQL
  END

二、存储过程的特点

1、存储过程可以进行复杂的业务逻辑处理
2、存储过程可以接受参数,也可以有回传值

三、存储过程的使用

准备工作

创建一个银行账户表

#创建一个账户表
create TABLE t_account (id int(10) PRIMARY KEY,accoutNum int(20),accountName VARCHAR(20),balance FLOAT)
#向表中插入两条信息
insert into t_account values    
                (1,2202001,"小炸药",100.0),
                (2,2202002,"小陈",200.0)

3.1无参存储过程

3.1.1创建存储过程

#创建一个无参数的存储过程
CREATE PROCEDURE p_test1()
  BEGIN
  SELECT *  FROM t_account;
  END

3.1.2 调用存储过程

call p_test1();

3.1.3 运行结果

file

3.2 有参存储过程

3.2.1 创建存储过程

#创建一个有参数的存储过程
#in代表传入的参数,out代表接受返回结果的
CREATE PROCEDURE p_test2(in a_name VARCHAR(20))
  BEGIN
  SELECT *  FROM t_account where accountName=a_name;
  END

3.2.2调用存储过程

call p_test2("小炸药");

3.2.3 运行结果

file

四、银行转账实例演示

简单的存储过程学完了那就上一个复杂的案例,通过存储过程来实现一个银行转账的过程
1、判断转出账户是否存在
2、判断转入账户是否存在
3、判断转出账户的余额是否充足
4、更新两个账户的存款

4.1 创建存储过程

CREATE PROCEDURE p_transfer(
    in  outName VARCHAR(20), 
    in inName  varchar(20),
        in amount FLOAT)
label:BEGIN
        /*声明两个变量*/
    DECLARE depositeOut FLOAT; #转出账户存款
        DECLARE depositeIn FLOAT; #转入账户存款
        /*通过查询表为两个变量赋值*/
    SELECT balance INTO depositeOut #将查询出的结果使用定义的depositeOut变量来接收
    FROM t_account 
        where accountName = outName;
        SELECT balance INTO depositeIn 
    FROM t_account
    WHERE accountName = inName;
        /*判断转出账户是否存在*/
        IF depositeOut IS NULL THEN
            LEAVE label; #相当于return label是在begin出声明的
        /*判断转入账户是否存在*/
        END IF;
        IF depositeIn IS NULL THEN
            LEAVE label;#相当于return label是在begin处声明的
        END IF;
        /*账号余额充足,执行转账操作*/
    IF depositeOut > amount THEN
            UPDATE t_account set balance = balance + amount where accountName = inName;
            UPDATE t_account set balance = balance - amount where accountName = outName;
        ELSE
            LEAVE label;
    END IF;
END;

4.2执行存储过程

4.2.1转账前

file

4.2.2 传入不符合条件的值

转账金额为500,账户余额不足
call p_transfer("小炸药","小陈",500);

没有执行转账操作

file

转出账户【小张】不存在
call p_transfer("小张","小陈",9.9);

没有执行转账操作

file

4.2.3传入符合条件的值

call p_transfer("小炸药","小陈",9.9);

转账成功,两个账户的余额发生变化

file

五、总结

存储过程将许多逻辑判断以及多条SQL封装到一起了,并且存储起来,方便日后重复且快速的调用。
今天的分享就到这里,初次学习如有错误,欢迎指正。

正文到此结束
本文目录