MySQL存储过程

存储过程:
把若干sql封装起来,起个名字   --过程
把此过程存储在数据库中        --存储过程

create procedure procedureName()
begin
  --sql
end$
######################
show procedure status;
调用call procedure()

声明变量:
格式 declare 变量名 变量类型 【default  默认值】
###############################
delimiter //
create procedure p3()
begin
declare age int default 18;
declare height int default 180;
select concat('age is', age, 'height is',height);
end;
//
call p3()//
##################################
set age := age + 20;
#################################
if condition then
statement
else
end if;
################
声明参数,传参
create procedure p5(width int ,height int)
begin
    select concat('area is ' width*height ) as area;
    if width > height then
    select 'fat'
    elseif width < height then
    select 'not fat'
    else 
    select 'fang'
    end if;
end;
//
#########################
顺序 选择  循环
求1-100的和
create procedure p6()
begin
  declare total int default 0;
  declare num int default 0;

  while num<=100 do
   -- add num to total
   set total := total+num;
   set num := num+1;
   end while;
   
   select total
end;
#############################
p7 I want get the sumary of 1 to N;

in型
create procedure p7(in n int)

while num <=n do

call p7(10);
###############################
in和out型
create procedure p8(in n int, out total int)
begin
  declare num int default 0;
  
  set total := 0;
  while num <=n do
   set num := num+1;
   set total := total+num;
   end while;
end;
call p8(100,@sumary)
select @sumary
##################################
inout型
create procedure p9(inout age int)
begin
  set age := age +20;
end;

set @currage =18;
call p9(@currage)
select @currage
###################################
how to use "case"


create procedure p10()
begin
  declare pos int default 0;
  set pos := floor(5*rand());

  case pos
  when 1 then select "1";
  when 2 then select "2";
  when 3 then select "3";
  else select 'I dont know'
  end case;
end;

call p10()
#####################################
repeate

create procedure p11()
begin
  declare total int default 0;
  declare i int default 0;
  repeat
    select i;
    set i := i+1;
  until i >100 end repeat;
  select total;
end;
######################################

游标:
create procedure p12()
begin
  declare row_gid int;
  declare row_num int;
  declare row_name varchar(20);
  declare getgoods cousor for select gid,num,name from goods;
  
  open getgoods;
  fetch getgoods into row_gid,row_num,row_name;
  select row_num,row_name;
  close getgoods;
end//

call p12()//
############################################
create procedure p13()
begin
  declare row_gid int;
  declare row_num int;
  declare row_name varchar(20);
  declare getgoods cousor for select gid,num,name from goods;
  
  open getgoods;
  fetch getgoods into row_gid,row_num,row_name;
  select row_num,row_name;

  fetch getgoods into row_gid,row_num,row_name;
  select row_num,row_name;

  fetch getgoods into row_gid,row_num,row_name;
  select row_num,row_name;

  fetch getgoods into row_gid,row_num,row_name;
  select row_num,row_name;

  close getgoods;
end//
call p13()  最后报错。
################################################
循环取出一张表的所有数据
create procedure p14
begin
  declare row_gid int;
  declare row_num int;
  declare row_name varchar(20);

  declare cnt int default 0;
  declare i int default 0;

  declare getgoods cursor for select gid,num,name from goods;
  select count(*) into cnt from gooods;

  open getgoods;

  repeat
    set i := i+1;
    fetch getgoods into into row_gid,row_num,row_name;
    select row_num,row_name;
    until i >=cnt end repeat
   
   cloes getgoods;
  

end//
###################################
通过越界标志来结束。
mysql 游标,可以declare continue handler来操作1个越界标识
declare continue handler for not found statement;



create procedure p15
begin
  declare row_gid int;
  declare row_num int;
  declare row_name varchar(20);


  declare you int defalut 1;
  declare getgoods cursor for select gid,num,name from goods;
  declare continue handler for not found set you :0;

  open getgoods;

  repeat
    
    fetch getgoods into into row_gid,row_num,row_name;
    select row_num,row_name;
    until you=0 end repeat;
   
   cloes getgoods;
  

end//
###################################
多取出1行,如何解决?
思考:如果not found后,后面的select 不再执行,最后就不会多取一行。
申明不再是continue, exist就能达到目的,后面的语句不再执行。
declare exit handler for not found set you :0;
#####################################
除了continue,exit外,还有一种undo handler
continue是触发后,后面语句继续执行
exit触发后,后面不再执行
undo触发后,前面的语句撤销
###############################
一行都没有怎么办?
create procedure p17
begin
  declare row_gid int;
  declare row_num int;
  declare row_name varchar(20);


  declare you int defalut 1;
  declare getgoods cursor for select gid,num,name from goods;
  declare continue handler for not found set you :0;

  open getgoods;
  fetch getgoods into into row_gid,row_num,row_name;


  repeat

    select row_num,row_name;    
    fetch getgoods into into row_gid,row_num,row_name;
    until you=0 end repeat;
   
   cloes getgoods;
  

end//
create procedure p18
begin
  declare row_gid int;
  declare row_num int;
  declare row_name varchar(20);


  declare you int defalut 1;
  declare getgoods cursor for select gid,num,name from goods;
  declare continue handler for not found set you :0;

  open getgoods;
  fetch getgoods into into row_gid,row_num,row_name;


  while you=1 do
    select row_num,row_name;
    fetch getgoods into into row_gid,row_num,row_name;
   end while;
   
   cloes getgoods;
  

end//
#####################################

 

posted on 2018-01-31 14:54  星期六男爵  阅读(149)  评论(0)    收藏  举报

导航