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_codeelse  mysql_codeend if;
if mysql_condtion then;  mysql_codeend if;

Sample_1:while

 while mysql_condtion do  mysql_code end while;

Sample_2:loop 
loop_name:loop  mysql_codeend 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:存储过程
    程序:调用存储过程

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

#方式三:
    MySQL:
    程序:类和对象,即ORM(本质还是纯SQL语句)
mysql  存储过程 与 循环
对于存储过程,可以接收参数,其参数有三类:

#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 'xxxxxxx@126.com'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=5end //

delimiter ;

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

上一篇:MySql存储过程 CURSOR循环


下一篇:POJ 3189 Steady Cow Assignment【网络流】