libralxj

导航

 

1、定义

  存储过程是数据库中的一个重要对象,可以把它理解成是一个“函数‘存在数据库中,如果需要调用存储过程,就可以直接输入函数名称来调用,和python里面的方式差不多。

  函数内部就是完成特定功能的SQL语句集,比如生成几百条测试数据等,当我们需要用到几百条数据的时候,就直接调用这个存储过程的函数名来运行,直接生成几百条数据,而不需要重复的去写很多SQL语句。

 

2、特点

  用来完成较复杂业务,比较灵活,易修改,好编写,可编程性强,编写好的存储过程可以重复使用。

 

3、存储过程优缺点

  优点: 效率高,可以被重复使用,安全

  存储过程在创建的时候直接编译,sql语句每次使用都要编译,效率高。

  存储过程可以被重复使用。

  存储过程只连接一次数据库,sql语句在访问多张表时,连接多次数据库。

  存储的程序是安全的。存储过程的应用程序授予适当的权限。

  

  缺点:移植性差,维护麻烦,很复杂的业务,存储过程也不行。

  在哪里创建的存储过程, 就只能在哪里使用,可移植性差。

  开发存储过程时,标准不定好的话,后期维护麻烦。

  没有具体的编辑器,开发和调试都不方便。

  太复杂的业务逻辑,存储过程也解决不了。

 

4、创建最简单的存储过程

  

create procedure  过程名()
begin
    .....这里写任意的sql语句
end;

 案例: 查看员工与部门表的全信息

create procedure dept_emp()
begin
    select * from dept;
    select * from emp;
end;




mysql> call dept_emp();

 4.1 存储过程变量

格式:

  declare  变量名 变量类型 default 默认值; #声明变量

  set 变量名 = 值; #变量赋值

  select  字段名 into 变量名 from  数据库表;  #查询表中字段,完成变量赋值

  select  变量名; #显示变量

1 create procedure emp_name()
2 begin 
3 declare ename varchar(20) default ";
4 select name into ename from emp where id = 1;
5 select ename;
6 end;
7 
8 
9 mysql> call emp_name();

5、存储过程传入参数

格式:

create procedure 过程名([IN] OUT [INOUT] 参数名 参数数据类型)

begin

....

end;

注意: in: 传入参数     out:传出参数   inout:可以传入也可以传出

核心是传入,对于测试而言,只需要搞懂这个就够了

in表示该参数的值必须在调用存储过程时指定,如果不显示指定为in ,那么默认就是in类型。

案例: 根据传入的id查看员工的姓名。

create procedure emp_id(eid int)

begin

declare ename varchar(20) default ";

select name into ename from emp where id = eid;

select ename;

end;


mysql> call emp_id(1);

 6、存储过程条件判断

格式:

if()

then

...

else

...

end if;

 

案例:输入一个id,判断它是否是偶数,偶数打印对应的姓名,奇数打印id。

create procedure emp_if_id(eid int)
begin
declare ename varchar(20) default ";
if(eid % 2 = 0)
then
select name into ename from emp where id = eid;
select ename;
    else
    select eid;
    end if;
end;




mysql>call emp_if_id(1);


mysql>call emp_if_id(2);

 

7、存储过程查看、删除

查看存储过程格式:

show procedure status;

 

删除存储过程格式:

drop procedure 存储过程名;

 

8、存储过程的循环语句(重点)

循环语句在任意一个编程语言里面都存在,在MySQL里面主要循环语句分为三类:while循环(重点)、repeat循环、loop循环。

while循环也是最常用的循环语句,它会持续执行循环体内的语句,直到指定的条件不再为真。

语法:

create procedure LoopExample()

begin 

  declare i int default 0; ----定义并初始化一个变量i

  while i < 5 do

    set i = i + 1;

    ---这里执行你需要的操作,例如插入数据到表中

    --insert into some_table(column) values(i);

  end while;

end;

 

repeat 循环(了解)

repeat循环会先执行循环体内的语句,然后检查条件,如果条件为假,则继续执行循环体内的语句;如果条件为真,则退出循环。

create procedure RepeatExample()

begin

  declare i int default 0;

  repeat

    set i = i + 1;

    select concat('Loop', i);

  until i > 5 end repeat;

end;

Loop循环提供了一种更灵活的方式来控制循环的执行。你可以为循环体命名,并使用leave 和iterate 标签来控制循环的流程。

create procedure RepeatLoopExample()

begin

  declare i int default 0;

  my_loop:LOOP

    SET i =  i + 1;

    select concat('Loop', i);

    

    if i > = 5 THEN

      LEAVE my_loop; ---当条件满足时退出循环

    else  

      iterate  my_loop;  --继续下一次迭代

    end if;

  end LOOP my_loop;

end;

 

 

9、面试题

  你使用过存储过程吗?使用存储过程来实现什么逻辑?[重点]

    主要是通过存储过程中的循环语句 + insert into 来插入数据,达到造数据的目的。

例如:创建一个用户表,id自增,在用户表中插入1000条记录。

create PROCEDURE test05()

begin 

  declare i int;  

  set i = 1;

  while i <= 1000 do

    insert into `user` (username,password,age,status) 

    values(concat('jack',i)"e10adc3949ba59abbe56e057f20f883e",20,0);

    set i = i+1;

    end while;

end;

 

call test_05();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

 
posted on 2026-04-26 17:46  可不可以不悲伤  阅读(11)  评论(0)    收藏  举报