存储过程
存储过程
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的作用域,所以无法再系统表当中是不能查询到的
 
- 定义在存储过程中的变量只能在存储过程中使用(就是在begin、end中定义的变量的作用域就是begin、end之间)
2.用户变量
相当于全局变量,用户变量会存储在数据库系统表(dual)当中
- 用户变量的定义:用户变量使用关键字set直接定义,变量名要以@开头
3.给变量设置值
无论是局部还是全局,都用关键字set修改值
 
                     
                    
                 
                    
                
 



 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号