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;