mysql存储过程学习笔记

本文转载:https://blog.csdn.net/qq_33157666/article/details/87877246

一、定义

  存储过程(Stored Procedure) 是在大型数据库系统中,一组为了完成特定功能的SQL语句集,存储在数据库中,经过第一次编译后调用不需要再次编译,用户通过指定存储过程的名称并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要的对象。

二、存储过程的特定

1、能完成较复杂的判断和运算

2、可编程性强,灵活

3、SQL编程的代码可重复使用

4、执行的速度相对快一些

5、减少网络之间的数据传输,节省开销

三、创建一个简单的存储过程

1、创建存储过程的简单语法

create procedure 名称()
begin
......
end;

2、创建一个简单的存储过程

1 create procedure test()
2 begin
3     select * from users;
4     select * from orders;
5 end;

3、调用存储过程

call test();

四、存储过程的变量

1、先通过一个简单的例子来学习变量的声明和赋值

 1 create procedure test2()
 2 begin
 3     --使用 declare 语句声明一个变量
 4     declare username varchar(32) default ‘‘;
 5     -- 使用set 语句给变量赋值
 6     set username=xiaoming;
 7     --将users表中的id=1的名称赋值给变量username;
 8     select name into username from users;
 9     --显示变量
10     select username;
11 end;

2、概括

  • 变量的声明使用declare,一句declare 只声明一个变量,变量必须先声明后使用;
  • 变量具有数据类型和长度,与mysql的SQL数据类型保持一致,因此甚至还能制定默认值、字符集和排序规则等;
  • 变量可以通过set来赋值,也可以通过select into 的方式赋值;
  • 变量需要返回,可以使用select语句,如:select 变量名。

五、变量的作用域

1、变量作用域说明:

  • 存储过程中变量是有作用域的,作用范围在begin和end块之间,end结束变量的作用范围即结束。
  • 需要多个块之间传值,可以使用全局变量,即放在所有代码块之前
  • 传参变量是全局的,可以在多个块之间起作用

2、通过一个实例来验证变量的作用域

  需求:创建一个存储过程,用来统计users、orders表中行数数量和orders表中的最大金额和最小金额

create procedure test3()
begin
    begin
        declare userscount int default 0;  -- 用户表中的数量
        declare ordercount int default 0;  -- 订单表中的数量
        select count(*) into userscount from users;
        select count(*) into ordercount from orders;
        select userscount,ordercount;  -- 返回用户表中的数量,订单中的数量
end;
    begin
        declare maxmoney int default 0;   -- 最大金额
        declare minmoney int default 0;    --最小金额
        select max(money) into maxmoney from orders;
        select min(money) into minmoney from orders;
        select maxmoney,minmoney;      -- 返回最大金额、最小金额
    end;
end;

3、我将过程test(3)改为如下

create procedure test3()
begin
    begin
        declare userscount int default 0; -- 用户表中的数量
        declare ordercount int default 0; -- 订单表中的数量
        select count(*) into userscount from users;
        select count(*) into ordercount from orders;
        select userscount ,ordercount;  --返回用户表中的数量、订单表中的数量
    end;
    begin
        declare maxmoney int default 0;  -- 最大金额
        declare minmoney int default 0;   -- 最小金额
        select max(money) into maxmoney from orders;
        select min(money) into minmoney orders;
        select userscount,ordercount,maxmoney,minmoney; -- 返回最大金额、最小金额
    end;
end;

-- 上述代码,会报错,需要将userscount,ordercount变量声明为全局变量

declare userscount int default 0; -- 用户表中的数量
declare ordercount int default 0; -- 订单表中的数量
声明到最外围的块中。

六、存储过程参数
1、基本语法
create procedure 名称([IN | OUT] 参数名 参数数据类型)
begin
......
end

存储过程的参数类型有: IN,OUT,INOUT,下面分别介绍这个三种类型:

2、存储过程的传出参数IN

  说明:

  • 传入参数:类型为in,表示该参数的值必须在调用存储过程时指定,如果不显示指定为in,那么默认就是in类型。
  • IN类型参数一般只用于传入,在调用过程中一般不作为修改和返回
  • 如果调用存储过程中需要修改和返回值,可以使用OUT类型参数

  通过一个实例来演示:

  需求:编写存储过程,传入id,根据id返回name

create procedure test4(userId int)
    begin
        declare username varchar(32) default ‘‘;
        declare ordercount int default 0;
        select name into username from users where id =userId;
        select username;
    end;

3、存储过程的传出参数out

  需求:调用存储过程时,传入userId返回该用户的name

  

create procedure test5(in userId int,out username varchar(32)
    begin
        select name into username from users where id=userId;
    end;

-- 定义一个变量 set 0 @变量名
    set @uname=‘‘;
    call test5(1,@uname);
    select @uname as username;

  概括:
        1、传出参数:在调用存储过程中,可以改变其值,并可返回;
        2、out是传出参数,不能用于传入参数值;
        3、调用存储过程时,out参数也需要指定,但必须是变量,不能是常量;
        4、如果既需要传入,同时又需要传出,则可以使用INOUT类型参数
  

  (3).存储过程的可变参数INOUT
    
        需求:调用存储过程时,传入userId和userName,即使传入,也是传出参数。

  

create procedure test6(inout userId int,inout username varchar(32))
begin
    set userId=2;
    set username=‘‘;
    select id,name into userId,username from users where id=userId;
end;

  概括:

   1.可变变量INOUT : 调用时可以传入值,在调用过程中,可以修改值,同时也可以返回值;

   2.INOUT参数集合了IN和OUT类型的参数功能;

   3.INOUT调用时传入的是变量,而不是常量;

 

 

未完待续。。。

mysql存储过程学习笔记

上一篇:Flask-SQLAlchemy详解


下一篇:mysql源码安装和主从同步配置