• Mysql数据库 10.SQL语言 储存过程 上


    存储过程==方法

    存储过程介绍

    SQL指令执行过程

    1.编写SQL指令

    2.通过网络传送SQL指令,编写SQL指令后通过数据库连接将指令传送到数据库

    3.数据库接收SQL指令

    4.当数据库接收到指令后,通过SQL引擎编译并执行SQL指令

    5.返回到DBMS显示查询结果

    存储过程

    把一些特殊的sql指令封装成一个sql指令集,类似于函数/方法

    给每一个指令集起一个名字,相当于函数/方法,避免重复执行相同的sql语句造成消耗

    用指令集的名字节省资源,不需要传输sql指令

    存储过程优缺点分析

    优点
    缺点

    1.不具备多产品之间的切换

    2.产生高性能的优化问题

    3.在互联网项目中(选择使用,抉择使用),如果出现数据库的高并发问题(连接较多,访问量较大),使用存储过程会增加数据库连接时的执行时间

    创建存储过程 

    存储过程的创建语法

    create procedure 存储过程名(自己定义)[IN 输入参数 类型 /OUT 输出参数 类型 args]

    begin

            ——SQL指令

    end;

    示例

    创建存储过程,进行加法运算

    代码实现
    1. create procedure proc_test1(IN a int,IN b int,out c int)
    2. begin
    3. #set 定义变量
    4. set c=a+b;#定义变量
    5. end;

    调用存储过程

    调用存储过程语法 关键字:call

    call 存储过程名;

    代码实现

    set定义一个变量接收方法的返回值

    1. #调用存储过程,call关键字 call 存储过程名;
    2. set @m=0;#定义变量接收返回值
    3. #调用存储过程,将3传递给a,将2传递给b,将@m传递给c
    4. call proc_test1(3, 2,@m);
    查看结果:显示变量值 (dual系统表,定义的变量的值在之中存储)
    select @m from dual;
    使用方法,运行结果

    存储过程中变量的使用

    存储过程中的变量分为两种:局部变量、用户变量

    定义局部变量

    局部变量:定义在存储过程中的变量,只能在存储过程中使用

    语法 关键字:declare

    declare 局部变量名 类型名 [default value];

    局部变量要定义在存储过程中,而且必须定义在存储过程的开始

    示例

    局部变量的定义

    代码实现
    1. #创建储存过程
    2. create procedure proc_test2(in a int,out r int)
    3. begin
    4. #定义局部变量
    5. declare x int default 0;
    6. declare y int default 1;
    7. set x=a*a;
    8. set y=a/2;
    9. set r=x+y;
    10. end
    11. #用户变量(全局变量)用set关键字定义,必须以一个@开头定义变量名称
    12. set @n=1;
    13. #用户变量存储在MYSQL数据库的数据字典(dual)中
    14. #调用储存过程
    15. #6*6+6/2
    16. call proc_test2(6,@n);
    17. #查询结果 6*6+6/2
    运行结果

    注:declare定义的变量只存储于存储过程中,无法取出,所以没有存储

    定义用户变量

    用户变量:相当于全局变量,定义的用户变量可以通过select @变量名 from dual 进行查询

    语法

    set @变量名;

    注意事项

    因为用户变量相当于全局变量,可以在SQL指令以及多个存储过程中共享,所以在开发中尽量少使用用户变量,会导致程序不易理解,难以维护

    给变量修改值

    无论局部变量还是用户变量,都使用set关键字修改值

    将SQL语句查询到的结果赋值给变量 select...into...语句

    将查询到的结果赋值给储存过程中的out参数,需要使用select...into...语句

    代码实现
    1. #将查询到的结果赋值给储存过程中的out参数,需要使用select...into...语句
    2. #查询studentes表中学生数量
    3. #创建储存过程
    4. create procedure pro_test3(out c int)
    5. begin
    6. select count(stu_num) into c from students s ;
    7. end;
    8. #调用储存过程
    9. call pro_test3(@n);
    10. select @n from dual;
    11. #@n为全局变量,可以全局使用
    运行结果

    存储过程中的参数

    IN 输入参数  / OUT 输出参数 / INOUT 输入输出参数

    代码实现
    1. #输入输出参数演示
    2. create procedure proc_test6(inout str varchar(20))
    3. begin
    4. select name into str from students s where stu_num = str;
    5. end;
    6. #定义变量
    7. set @name1 = '20220109';
    8. call proc_test6(@name);
    9. select @name from dual;
    10. #等价于输入和输出参数

    运行结果

    等价于

    代码实现
    1. #创建储存过程
    2. create procedure proc_test4(in snum char(8),in sname varchar(20),in gender char(2),in age int,in cid int)
    3. begin
    4. insert into students(stu_num,name ,stu_gender,stu_age,cid)
    5. values(snum,sname,gender,age,cid);
    6. end;
    7. #调用储存过程
    8. call proc_test4('20220109','小李','女',20,1);
    9. #输出参数的演示
    10. create procedure proc_test5(in snum char(8),out sname varchar(20))
    11. begin
    12. select name into sname from students s where stu_num =snum;
    13. end;
    14. #等价于输入输出合一
    15. set @name='';
    16. call proc_test5('20220109',@name);
    17. select @name from dual;

    运行结果

  • 相关阅读:
    【设计模式】行为型设计模式
    浏览器工作原理
    【计算智能】读书笔记 第八章节 分布估计算法
    百度之星程序设计大赛
    Mybatis下的SQL注入漏洞原理及防护方法
    网络传输用户层协议详解
    分享电脑便捷妙招,电脑小白们快码住
    脚踏实地,步步高升丨吴高升学长采访录
    react-navigation学习
    [Spring] AOP面向切面编程
  • 原文地址:https://blog.csdn.net/m0_73983707/article/details/134257450