存储过程

存储过程

SQL指令执行流程

1.navicat编写并运行sql语句
2.通过navicat与mysql之间的连接,将sql语句传给mysql数据库
3.数据库接收sql指令
4.sql引擎编译执行语句
5.mysql将执行结果通过navicat与mysql之间的连接后才能给navicat
6.显示查询结果
思考:

  • 1.如果需要重复多次执行相同的指令,sql执行每次都需要通过连接传递到mysql,并且每次进行编译与执行的步骤;(重复步骤,效率降低,占用网络资源)
  • 2.如果需要连续执行多个sql指令,并且第二个sql指令需要使用第一个SQL指令执行的结果作为参数。(无法实现。语句独立,联系性不强)

在指令传递的过程中还会牵扯到一些安全问题,比如某种拦截器将sql指令拦截并修改,就会造成数据的丢失或修改,产生安全问题
需要利用存储过程的知识来解决这样的问题。

存储过程介绍

当一个sql语句,其通过编写、传递、编译等步骤得到的sql指令,可以存储到mysql中并且对其进行命名,等到再需要使用这条指令的时候,直接调用即可,如同java中的封装思想

  • 存储过程:(在数据库端)
    1.将能够完成特定功能的sql指令进行封装,编译之后存储在数据库服务器上,并为其取一个名字;
    2.当客户需要执行这个功能时,不用在编写sql指令,直接通过封装的sql指令的名字完成调用即可。

存储过程的优缺点

  • 优点
    1.sql指令无需客户端编写,通过网络请求直接使用,节省网络开销;
    2.避免指令在网络传输过程中被恶意篡改,保证安全性
    3.存储过程经过编译创建并保存在数据库中,无需重复编译
    4.存储过程中多个sql指令之间存在逻辑关系,支持流程控制语句(分支,循环),可以实现更为复杂的业务;
  • 缺点
    1.存储过程时根据不同的数据库进行编译存储在数据库中,当切换到其他的数据库产品时,需要重新编写新数据库产品的存储过程;
    2.存储过程受限于数据库产品,如果需要高性能的优化会成为一个问题(不同数据库的性能不同);
    3.如果需要数据库的高(连接)并发访问,使用存储过程会增加数据库响应时间,原因是将复杂的业务交给了数据库来处理(也就是说数据库在执行逻辑过程);

如何创建存储过程

存储过程:将能够完成特定功能的sql指令进行封装
需求:创建一个存储过程实现加法运算(在java中加法运算要有参数以及返回值;在存储过程里,要有输入参数和输出参数
语句:
create procedure <自定义过程名称>(in 输入变量1 数据类型, in 输入变量2 数据类型..., out 输出变量3 数据类型)
begin
set c = a + b;
end;
语义:关键字in表示输入参数,关键字out表示输出参数;关键字begin、end相当于一对花括号,在两者之间完成逻辑语句;要利用关键字set来声明为输出参数赋
如:
create procedure proc_test1(in a int, in b int, out c int)
begin
** set c = a + b;

end;

调用存储过程

set @m = 0;(定义变量@m)
call <存储过程名称>(实参1, 实参2, @m);(调用存储过程,将3的值传递给a,将2的值传递给b,将@m传递给c)
select @m from dual;(显示变量值,dual是系统表)
如:
set @m = 0;
call <存储过程名称>(3, 2, @m);
select @m from dual;

存储过程中的变量使用

  • 存储过程中的变量分为两种:
    1.局部变量
    • 定义在存储过程中的变量只能在存储过程中使用(就是在begin、end中定义的变量的作用域就是begin、end之间)
      需求:计算参数的平方与输入参数的二分之一的和
      create procedure proc_test1(in a int, out c int)
      begin
      ** declare x int default 0;(在内部定义变量x,int类型,默认值为0)
      ** declare y int default 0;
      (在内部定义变量y,int类型,默认值为0)
      ** set x = a * a;**
      ** set y = a / 2;**
      ** set r = x + y;**
      end;

      但当使用语句select r from dual;在系统表中寻找r时会发现报错

      原因就是,已经超出了r的作用域,所以无法再系统表当中是不能查询到的

2.用户变量
相当于全局变量,用户变量会存储在数据库系统表(dual)当中

  • 用户变量的定义:用户变量使用关键字set直接定义,变量名要以@开头

3.给变量设置值
无论是局部还是全局,都用关键字set修改值

posted @ 2023-02-24 20:02  BattleTrumpet  阅读(105)  评论(0)    收藏  举报