声明变量:
语法:declare var_name[,...] type [default value]
说明:这个语句被用来声明局部变量。要给变量提供一个默认值,需要包含一个default子句。值可以被指定为一个表达式,不需要为一个常数。如果没有default子句,初始值为null。局部变量的作用范围在它被声明的begin ... end块内。它可以被用在嵌套的块中,除了那些用相同名字声明变量的块。
ex:
declare a int default 0;
declare b int default 1;
declare c,d int;
变量赋值
- set语句:
语法:set var_name = expr [, var_name = expr] ...
说明:也可以用语句代替set来为用户变量分配一个值。在这种情况下,分配符必须为:=而不能用=,因为在非set语句中=被视为一个比较 操作符
ex:
set @a=0,@b=0,@c=0;
或
select @a:=1,@b:=2,@c:=3;
ps:对于使用select语句为变量赋值的情况,若返回结果为空,即没有记录,此时变量的值为上一次变量赋值时的值,如果没有对变量赋过值,则为null。
- select... into语句
语法:select col_name[,...] into var_name[,...] table_expr
说明:这个select语法把选定的列直接存储到变量。因此,只有单一的行可以被取回。
ex:
select id,name into x,y from user limit 1;
begin...end复合语句
语法:
[begin_label:] begin
[statement_list]
end [end_label]
说明:存储子程序可以使用begin... end复合语句来包含多个语句。statement_list 代表一个或多个语句的列表。statement_list之内每个语句都必须用分号(;)来结尾。 复合语句可以被标记。除非begin_label存在,否则end_label不能被给出,并且如果二者都存在,他们必须是同样的
ex:
\\ begin
declare a int default 1;
declare b int default 4;
declare c int;
if a+b == 5 then
c = a+b;
end if;
end//
流程控制结构
- if语句
语法:
if search_condition then
statement_list
[else if search_condition then
statement_list] ...
[else statement_list]
end if
说明:statement_list可以包括一个或多个语句。
ex:
delimiter //
create procedure test(in inparameter int)
begin
declare a int;
set a = inparameter + 1;
if a = 0 then
.......;
end if;
if inparameter = 0 then
.......;
else
.......;
end if;
end; //
delimiter ;
- case语句
语法:
case case_value
when when_value then statement_list
[when when_value then statement_list] ...
[else statement_list]
end case
或者:
case
when search_condition then statement_list
[when search_condition then statement_list] ...
[else statement_list]
end case
ex:
create procedure test2 (in parameter1 int)
begin
declare a int;
set a = parameter1 + 1;
case a
when 0 then insert into t values(166);
when 1 then insert into t values(158);
else insert into t values(198);
end case;
end;
- 循环语句
语法:
while… end while
loop… end loop
repeat… end repeat
说明:在循环中还穿插一些循环控制语句,如leave(类似Java语言的break)、iterate(类似java语言的continue)等。
leave语句
leave label 这个语句被用来退出任何被标注的流程控制构造。它和begin... end或循环一起被使用。
iterate语句
iterate label iterate只可以出现在loop, repeat, 和while语句内。iterate意思为:再次循环。
ps:iterate 跟Java语言中的迭代器不同含义
while… end while ex:
create procedure test3 ()
begin
declare a int;
set a = 0;
while a < 5 do
set a = a + 1;
end while;
end;
loop … end loop ex:
create procedure test4 ()
begin
declare a int;
set a = 0;
loop_label: loop
set a = a + 1;
if a >= 5 then
leave loop_label;
end if;
end loop;
end;
ps:loop允许某特定语句或语句群的重复执行,实现一个简单的循环构造。在循环内的语句一直重复直到循环被退出,退出通常伴随着一个leave 语句。
repeat … end repeat ex:
create procedure test5 ()
begin
declare a int;
set a = 0;
repeat
set a = a + 1;
until a >= 5 end repeat;
end;
迭代(ITERATE)语句ex:
create procedure test6 ()
begin
declare a int;
set a = 0;
loop_label: loop
if a = 3 then
set a = a + 1;
iterate loop_label;
end if;
set a = a + 1;
if a >= 5 then
leave loop_label;
end if;
end loop;
end;
条件和异常处理程序:
语法:
declare handler_type handle for condition_value[,...] sp_statement
handler_type:
continue | exit | undo
condition_value:
SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION
说明:这个语句指定每个可以处理一个或多个条件的处理程序。如果产生一个或多个条件,指定的语句被执行。
对一个CONTINUE处理程序,当前子程序的执行在执行处理程序语句之后继续。对于EXIT处理程序,当前BEGIN...END复合语句的执行被终止。UNDO 处理程序类型语句还不被支持。
SQLWARNING是对所有以01开头的SQLSTATE代码的速记。
NOT FOUND是对所有以02开头的SQLSTATE代码的速记。
SQLEXCEPTION是对所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE代码的速记。
声明自定义条件:
语法:declare condition_name condition for condition_value
condition_value:
SQLSTATE [VALUE] sqlstate_value
ex:
create table test (s1 int,primary key (s1));
delimiter //
create procedure handlerdemo ()
begin
declare continue handle for SQLSTATE '23000' SET @x = 3;
set @x = 1;
insert into test values(1);
set @x = 2;
insert into test values(2);
set @x = 3;
end;//
delimiter ;