mysql深入浅出的笔记(存储过程二)

本文详细介绍了MySQL存储过程中条件处理、游标使用及流程控制的方法。包括如何定义和处理错误条件,利用游标遍历结果集,以及通过IF、CASE、LOOP等语句控制流程。

1.条件的定义和处理可以用来定义在处理过程中遇到问题时相应的处理步揍:

 

DECLARE condition_name CONDITION FOR condition_value

condition_value:
SQLSTATE [VALUE] sqlstate_value:为长度为5的字符串类型的错误代码;
| mysql_error_code:为数值类型错误代码

 

//1.使用sqlstate_value
 DECLARE command_not_allowed  CONDITION FOR SQLSTATE ’42000′;
 //2使用mysql_error_code

DECLARE command_not_allowed CONDITION FOR 1148;

 

这个语句需要特殊处理的条件,它将一个名字和制定的错误条件关联起来,这个名字可以

用在DECLARE HANDLER语句中.除了SQLSTATE值,也支持MySQL错误代码。

 

DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement
handler_type: 错误处理方式,参数为三个值之一
CONTINUE:表示遇到错误不处理,继续执行
| EXIT  : 遇到错误马上退出
| UNDO  ;表示遇到错误后撤回之前的操作,MySQL暂不支持回滚操作;
condition_value:

SQLSTATE [VALUE] sqlstate_value :五个字符的字符串错误值
| condition_name :DECLARE CONDITION定义的错误条件名称;
| SQLWARNING  配所有以01开头的SQLSTATE错误代码;
| NOT FOUND  配所有以01开头的SQLSTATE错误代码;
| SQLEXCEPTION 匹配所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE错误代码;
| mysql_error_code 匹配数值类型错误代码;

 // 这种捕获 sqlstate_value 的值为"23000".执行CONTINUE操作,并x2=1;

DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;

下面是mysql深入和浅出的截图

 

           从上面看出set @x = 2 以后,发生了主键重复的错误,即set @x= 3;没有执行;

 

          下面对主键异常的处理;

                         

           DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;

           中的CONTINUE 即继续执行,@x = 3;调用条件处理的过程,再遇到主键重的错误时,会按照定义的处理方式进行处理,由于例子
           中定义的是CONTINUE,所以会继续执行下面的语句。

2.(光标)游标的使用

在存储过程和函数中可以使用光标对结果集进行循环的处理。光标的使用包括光标的声明、
OPEN、FETCH 和CLOSE,其语法分别如下。

 

create procedure pay()
begin 
    declare i_id int;
    declare i_amount  decimal(5,2);
    DECLARE  cur_pay cursor for select id,amount from pay; //1 .定义游标
    DECLARE EXIT handler for NOT FOUNT CLOSE cur_pay;

//这里的declare 是有先后顺序的.变量和条件必须在最前面声明,然后才能是光标的声明,最后才可以是处理程序
//的声明。 set @x1 = 0; set @x2 = 0; open cur_pay; //2.打开游标 repeat fetch cur_pay into i_id,i_amount; //3.mysql中使用fetch关键字使用游标 if i_id = 2 then set @x1=@x1+i_amount; else set @x2=@x2+i_amount; end if; until 0 end repeat; close cur_pay; // 4.关闭游标 end ;

 

3.流程的控制

  1) if (条件的判断 像程序中if)

IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF

 

 

  2) case

改写上面处理的if语句:
  repeat
    fetch cur_pay into  i_id,i_amount;
    case   i_id
    when   2    then  
       set  @x1=@x1+i+amount;
    else 
       set @x2 = @x2+i_amount;

   end case;
until 0 end repeate;

或 

repeat
    fetch cur_pay into  i_id,i_amount;
   case 
     when  i_id=2 then  
         set  @x1=@x1+i+amount;
    else 
         set @x2 = @x2+i_amount;

   end case;
until 0 end repeate;

 

 

 

   

  3)loop    4) leave

   LOOP 实现简单的循环,退出循环的条件需要使用其他的语句定义,通常可以使用LEAVE 语句实现.如果不增加推出循环语句,那么Loop语句实现死循环.

   

create procedure p_loop()

begin 
     declare i int;
     set i=0;
  loop_label : LOOP
     insert into p valuese(i);
      set i=i+1;
      if  i>=5 then
      LEAVE loop_label;
     end if;
  end LOOP;
end;

 

 

 

  5) iterate

TERATE 迭代        
     如果是在ITERATE语句,即迭代语句中的话,就必须使用LEAVE语句。ITERATE只能出现在LOOP,REPEAT和WHILE语句中,它的意思是“再次循环”,例如:
mysql> create procedure pro15() 
    -> begin
    -> declare i int default 0;
    -> loop_label:loop
    ->     if i=3 then
    ->         set i=i+1; //当 i=3时,执行了这条语句即 i=4;由于iterator相当于continue,则从loop时开始执//行 .insert会插入4 
    ->         iterate loop_label;
    ->     end if;
    ->     insert into t1(filed) values(i);
    ->     set i=i+1;
    ->     if i>=5 then
    ->        leave loop_label;
    ->     end if;
    ->   end loop;
    -> end;//
Query OK, 0 rows affected (0.00 sec)
可以这样理解ITERATE就是我们程序中常用的contiune,而leave就是break.当然在MySQL存储过程,需要循环结构有个名称,其他都是一样的.

 

 

 

   6)repeate

create procedure p_loop()

begin 
     declare i int;
     set i=0;
 REPEAT
     insert into p valuese(i);
      set i=i+1;
     UTIL i>=5;

  end  REPEATE;
end;

 

 

   7)while 语句

create procedure p_loop()

begin 
     declare i int;
     set i=0;
while i<5 DO
     insert into p valuese(i);
      set i=i+1;


  end  while;
end;

 

 

 

  

转载于:https://www.cnblogs.com/fengyuwan/p/5227521.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值