概述
适合有一定数据库基础的人员 用来快速掌握mysql的sp基本语法、逻辑控制、异常处理 包括与Oracle数据库用法的对比,加深理解和记忆 包括一个完整的存储过程示例
1、基本语法
变量定义:必须declare 开头,默认值default关键字。eg:declare a,b int default 5; 变量赋值:set a=5; while循环:while do end while。 repeat循环:repeat until end repeat。 异常处理:类似DB2的语法,预先定义异常处理方法,与变量类似。
DECLARE
{EXIT | CONTINUE }
HANDLER FOR
{error- number | {SQLSTATE error- string}| condition}
SQL statement
调用存储过程:call sp();
2、SP示例
CREATE DEFINER = ` test` @`%` PROCEDURE ` sp_test` ( in in_par1 int )
BEGIN
declare vn_val1 int default 10 ;
declare vn_val_plus int ;
declare vn_i int ;
declare b int default 0 ;
declare rs_cursor cursor for select col from c1 order by col;
declare exit handler for sqlstate '23000'
begin
set b= 1 ;
set @expt = concat( '23000 fired' , DATE_FORMAT( NOW ( ) , '%Y-%m-%d %T' ) ) ;
end ;
set vn_val_plus= in_par1+ vn_val1;
set @x1 = vn_val_plus;
set vn_i= 0 ;
while vn_i< 5 do
insert into c1 values ( vn_i) ;
set vn_i= vn_i+ 1 ;
end while ;
set vn_i= 10 ;
label_loop1:loop
if b then
leave label_loop1;
end if ;
set @vn_i_before = vn_i;
insert into c1 values ( vn_i) ;
set vn_i= vn_i- 1 ;
set @vn_i_after = vn_i;
end loop ;
set @end = 'this is end' ;
END
说明
c1是一张测试表,只有1个int型字段,且是主键。用来实验23000错误(违反主键约束)。 通过call sp_test(10)调用SP。 continue handler,异常触发后,进度对应的handler,然后继续执行异常语句后的内容。 exit handler,异常触发后,直接退出整个程序。 注意:不同类型下vn_i_after和end的差异。
handler类型 @x1 @expt @vn_i_before @vn_i_after end exit 20 23000 fired date 4 4 continue 20 23000 fired date 4 3 this is end
每次执行后, 清空会话变量,否则上次的会话变量可能沿用,影响判断。这也是会话变量与函数内普通变量的差异!