MySQL---存储过程

存储过程的相关概念

是一组为了完成特定功能的sql语句的集合,类似于函数

写好了一个存储过程之后,我们可以像函数一样随时调用sql的集合。

复杂的,需要很多sql语句联合执行完成的任务

存储过程再执行上比sql语句的执行速度更快,效率也更高。

存储过程的优点

  • 执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率。
  • SQL语句加上控制语句的集合,灵活性高。
  • 在服务器端存储,客户端调用时,降低网络负载。
  • 可多次重复被调用,可随时修改,不影响客户端调用。
  • 可完成所有的数据库操作,也可控制数据库的信息访问权限。

存储过程的管理

存储过程的创建过程:

 ##创建存储过程:
 DELIMITER $$                  #将语句的结束符号从分号;临时改为两个$$ (可以是自定义)
 CREATE PROCEDURE Proc ()      #创建存储过程,过程名为Proc,不带参数
 -> BEGIN                      #过程体以关键字BEGIN开始
 -> select * from store_info;  #过程体语句
 -> END $$                     #过程体以关键字END结束
 ​
 DELIMITER;                    #将语句的结束符号恢复为分号
 

delimiter $$ #将语句的结束符号从分号临时改变成两个$$

create procedure proc () #创建存储过程proc:存储过程的名称。不能重复在当前库中唯一。括号里面不定义任何方法。

begin #过程体开始的关键字。begin后面跟上的是需要执行的sql语句。

end $$ #表示整个语句结束,和上面的定义开始符号一一对应。

delimiter; #将结束语句的分号恢复。

delimiter的作用就是保证整个存储过程中的sql语句能够被完整执行。

调用存储过程

 格式: call 存储过程名称

call proc1;

查看存储过程 

 SHOW CREATE PROCEDURE [数据库.]存储过程名;  #查看某个存储过程的具体信息​
 SHOW CREATE PROCEDURE Proc;
 SHOW CREATE PROCEDURE Proc\G

show procedure status where db='kgc';
show procedure status like 'proc';
#查询当前库中有多少存储过程

call proc;
#调用存储过程

MySQL---存储过程_第1张图片

drop procedure if exists proc;
#如果proc这个存储过程存在则删除

MySQL---存储过程_第2张图片

存储过程的使用

mysql> delimiter $$
mysql> create procedure proc2 ()
    -> begin
    -> insert into info2 values('小白','running','2002-7-11');
    -> select * from info2 ;
    -> delete from info2 where name='小刚';
    -> end $$
mysql> delimiter ;
mysql> call proc2;

MySQL---存储过程_第3张图片

给存储内容传参

存储过程中参数有三种运用的方式

  • IN 输入参数: 表示调用者向过程传入值。(传入值可以是字面量或变量)
  • OUT 输出参数: 表示过程向调用者传出值。(可以返回多个值)(传出值只能是变量)
  • INOUT 输入输出参数: 既表示调用者向过程传入值,又表示过程向调用者传出值。(值只能是变量)

驶入参数

delimiter $$                                  //修改sql的结束语句标志$$
create procedure test1 (in uname char(20) )   //指定传参的变量位uname  后面为变量位的数据类型
begin
select * from info where name = uname;        //以变量位where查询条件,进行查询
select * from info;                           //查看
end $$                                        //结束符
delimiter;

call test1('郭琦');
#call 存储过程名(传参内容)

#数据清晰和指定数据入库。分析数据行为。
传出参数
insert into info values(2,'郭琦',@num,'是');
#传出参数。调用存储过程内部的数据传出参数到info表中

MySQL---存储过程_第4张图片

输入和输出参数

delimiter $$
create procedure test3 (inout str varchar(10))
#定义了变量之后一定要定义数据类型是什么
BEGIN
select str;
#显示输入字符
set str = concat(str,'_ky32');
#让传入的字符串做一个拼接
select str;
#加工之后的字符串
end $$
delimiter;
 
set @str='刘亚伟';
#先传参,在外部需要加上@
call test3(@str);
 
update info set name=@str where id = 1;
#看一下加工后str的内容

in:先传入,定义变量的值,初始值 call test3 调用存储过程,把变量的值传入存储 @str=刘亚伟_ky32

存储过程中的控制语句

delimiter $$
create procedure test5 (inout num int)
BEGIN
if num >=10 then
set num=num-6;
else
set num=num*2;
end if;
#结束if语句的判断
select num;
end $$
delimiter;
 
set @num=19;
 
call test5(@num);
 
update info set id = @num where score = 100;

调用多个参数

调用多个参数:范围的方式匹配,完成传参------写入表中

delimiter $$
create procedure test6 (inout score int,out grade varchar(15))
BEGIN
if score between 85 and 100 then
set grade = '优秀';
elseif score between 60 and 84 then
set grade = '一般';
else
set grade = '不及格';
end if;
select grade;
end $$
delimiter;
 
set @score=90;
 
call test6(@score,@grade);
 
update info set score=@score,pass=@grade where id =1;

while:循环语句

delimiter $$
create procedure test7 (out rescult int)
BEGIN
declare a int;
declare i int;
#在过程体当中声明变量
set a=10;
set i=1;
while i<=10 do
set a=a+10;
set i=i+1;
#相当于i++
end while;
set rescult =a;
end $$
delimiter;
 
set @rescult=90;
 
call test7(@rescult);
 
select @rescult;

注意点:在使用存储过程中,在内部变量不需要加@,外部使用和赋值要加@,引用变量,在存储过程begin之后声明变量。要用declare a int; declare i int; 声明变量要加数据类型。 要想使用存储过程里面的结果,必须要out才能传出参数。在声明存储变量时,要定义好参数的传参方式 in out inout
 

你可能感兴趣的:(mysql,数据库)