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 存储过程 与 循环的主要内容,如果未能解决你的问题,请参考以下文章