mysql 存储过程 与 循环

Posted yanxiatingyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 存储过程 与 循环相关的知识,希望对你有一定的参考价值。


mysql 操作同样有循环语句操作,三种标准循环模式:while, loop,repeat, 外加一种非标准循环:goto [在c或c#中貌似出现过类型循环但是一般不建议用!]


一般格式为:
delimiter // 定义结束符
drop procedure if exists wk; 假如存在则删除
create procedure name([in | out | input] 参数)

begin

  while-loop-repeat-mysql-code

end //
delimiter ;  还原


定义变量:
  declare count int default 1; 定义count为int类型 并且设置初始值为1;
  set count=1;  修改count变量的值为1
  set count=count+1; 相当于python里面的自加
打印值:
   select count;
条件语句:
if mysql_condtion then;
  mysql_code
else
  mysql_code
end if;

if mysql_condtion then;
  mysql_code
end if;


Sample_1:while

while mysql_condtion do
  mysql_code
end while;


Sample_2:loop
loop_name:loop
  mysql_code
end loop;

Sample_3:repeat
repeat 
  mysql_code
until mysql_condtion
end repeat;

BEGIN
    
    declare i int default 0;
    loop_label: loop
        
        set i=i+1;
        if i<8 then
            iterate loop_label;
        end if;
        if i>=10 then
            leave loop_label;
        end if;
        select i;
    end loop loop_label;

END

存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql

使用存储过程的优点:

#1. 用于替代程序写的SQL语句,实现程序与sql解耦

#2. 基于网络传输,传别名的数据量小,而直接传sql数据量大

使用存储过程的缺点:

#1. 程序员扩展功能不方便

补充:程序与数据库结合使用的三种方式

技术分享图片
#方式一:
    MySQL:存储过程
    程序:调用存储过程

#方式二:
    MySQL:
    程序:纯SQL语句

#方式三:
    MySQL:
    程序:类和对象,即ORM(本质还是纯SQL语句)
技术分享图片
对于存储过程,可以接收参数,其参数有三类:

#in          仅用于传入参数用
#out        仅用于返回值用
#inout     既可以传入又可以当作返回值


废话不多说 上代码


#loop 循环
delimiter //
drop procedure if exists sum2;
create procedure sum2(args int)
begin
declare sum int ;
declare count int ;
set count=1;
set sum=1;
loop_name:loop
if count>args then
leave loop_name;
end if;
set sum=sum+count;
set count=count+1;
end loop;
select sum; 输出
end //
delimiter ;




delimiter //
drop procedure if exists sum2;
create procedure sum2(args int)
begin
declare sum int ;
declare count int ;
set count=1;
set sum=1;
loop_name:loop --循环开始
if count>args then
leave loop_name; --判断条件成立则结束循环
end if;
set sum=sum+count;
set count=count+1;
end loop; --循环结束
select sum; --输出结果
end //
delimiter ;






desc copy;
copy_struct: id int priymary key auto_increment
        sname varchar(25) not null

#无参 存储过程
delimiter //
drop procedure if exists loopcc;
create procedure loopcc()
begin
declare i int;
set i=0;
repeat
insert into copy (sname) values (now());
set i=i+1;
until i>=20
end repeat;
end //
delimiter;



#有参 存储过程
delimiter //
drop procedure if exists sum3;
create procedure sum3(a int)
begin
declare sum int default 0;
declare i int default 1;
repeat -- 循环开始
set sum=sum+i;
set i=i+1;
until i>a end repeat; -- 循环结束
select sum; -- 输出结果
end//
delimiter ;
---执行存储过程
call sum3(100);
drop prodedure if exists sum3;





desc register_time;
register_time struct:
id int parmary key auto_increment,
name varchar(15) not null,
register_time datetime not null,
email varchar(60) not null default ‘[email protected]
gender enum(‘male‘,‘female‘) default ‘male‘


#存储过程
delimiter //
create procedure p1()
BEGIN
DECLARE num INT ;
SET num = 0 ;
WHILE num < 100000 DO --循环开始
insert into index_test (name,regiter_time) values(‘李宗军‘,now());
SET num = num + 1 ;
END WHILE ; --结束

END //
delimiter ;






desc copy;
copy_struct: id int priymary key auto_increment
        sname varchar(25) not null

#while 循环
delimiter //
drop procedure if exists wk;
create procedure wk()
begin
declare i int;
set i=1;
while i<8 do
insert into copy (sname) values (‘你大爷‘);
set i=i+1;
end while;
end //
delimiter ;


desc student;
student_stuct:
sid int parmary key auto_increment,
gender enum(‘male‘,‘female‘) default ‘male‘,
class_id int not null,
sname varchar(32) not null

#传参数查询 指定范围的 数据

delimiter //
drop procedure if exists get_data;
create procedure get_data(in id_value int)
begin
  select * from student where sid>id_value;
end //

delimiter ;

call get_data(4);
drop procedure get_data;



create table emp(
eid int primary key auto_increment,
ename varchar(20),
sex enum(‘male‘,‘female‘) not null default ‘male‘,
hire_time datetime default now(),
salary varchar(15) not null default ‘egon大哥看着给!‘,
department_fk int
);


insert into emp (ename,department_fk) values(‘egon‘,2);

 


查询员工

--创建存储过程

delimiter //
drop procedure if exists get_emp_info;
create procedure get_emp_info(eid int)
begin
select * from emp where emp.eid=eid;
end //

delimiter ;

call get_emp_info(1);
drop procedure get_emp_info;


同样的 在begin里面可执行其他操作来进行值得修改与查询

Sample:

  begin
    update emp set sex=‘female‘ where eid=1;
  end

  begin
    truncate emp;
  end

  begin
    delete from emp;
  end

  
out 参数的使用

delimiter //
drop procedure if exists get_res;
create procedure get_res(out res int)
begin
  select department_fk from emp where eid=res;
  set res=5
end //

delimiter ;

set @res=1;
call get_res(@res);
select @res;





















































































































































































































































































以上是关于mysql 存储过程 与 循环的主要内容,如果未能解决你的问题,请参考以下文章

mysql存储过程实现数据查询与插入

mysql 存储过程出现死锁

利用mysql存储过程循环插入新数据并更新

mysql存储过程 游标双重循环

mysql存储过程中怎么在循环中取变量值???

MySQL---存储过程 及 条件语句循环语句