存储过程基本语法
存储过程就是一条或多条SQL语句的集合,可视为批文件,但作用不仅限于批处理,本文介绍如何创建存储过程以及变量的使用,如何调用、查看等。
创建语法如下:
create procedure sp_name([proc_parameter]) (characteristics ...) routine_body
pro_parameter:参数列表,
列表形式:[in|out|inout] param_name type
characteristics:存储过程的特性,有以下取值
language sql:说明toutine_body部分是由sql组成;
[not] deterministic:指明相同的输入是否会得到相同的输出,deterministic表示结果确定,not deterministic表示不确定,默认为not deterministic;
{contains sql | not sql | reads sql data | modifies sql data}:指明子程序使用sql的限制,其中contains sql指不包含读写数据的sql语句;not sql表示不包含sql语句;reads sql data说明子程序包含读数据的语句;modifies sql data表明子程序包含写数据的语句。默认contains sql。
sql security {definer | invoker}:指明谁有权限来执行,definer表示只有定义者才能执行,invoker 表示拥有权限的调用者可以执行,默认情况下为definer。
comment 'String':注释信息,可以用来描述存储过程。
routine_body:sql代码内容,用Begin ... End来表示sql代码的开始和结束。
举个简单的应用例子,有表为fruits存有单价、名称等,创建存储过程返回所有水果的评均价格,代码如下:
create procedure AvgFruitPrice(out param1 int)
Begin
select avg(f_price) into param1 from fruits;
End;
变量的使用
1.定义变量,语法如下:
Delare var_name [,var_name] ... date_type[DEFAULT value];
var_name是局部变量名称,DEFAULT value子句为变量提供初始值。
2.为变量赋值,语法格式如下:
Set var_name = expr1[,var_name = expr2] ...;
声明三个变量,分别为var1,var2,var3,数据类型为int,使用set为变量赋值,代码如下:
Declare var1, var2, var3 int;
Set var1=10, var2=20;
Set var3 = var1 + var2;
还可以通过select ... from为一个变量赋值:select col_name[, ...] into var_name[, ...] from table where...。
流程控制的使用
1.IF语句,语法格式如下:
IF expr_condition THEN statement_list
[ELSEIF expr_condition THEN statement_list]...
[ELSE statement_list]
END IF
2.case语句,语法格式如下:
CASE case_expr
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list]...
[ELSE statement_list]
END CASE
3.LOOP语句(循环操作的过程),语法格式如下:
[loop_label:] LOOP
statement_list
END LOOP [loop_label]
4.LEAVE语句
LEAVE语句用来退出循环。
Delare id int default 0;
add_loop:LOOP
SET id = id + 1;
IF id >= 10 THEN LEAVE add_loop;
END IF;
END LOOP add_loop;
5.ITERATE 语句,语法形式:ITERATE label
该语句只能出现在循环内,意为“再次循环”。
6.REPEAT语句
该语句创建一个带条件判断的循环的过程,每次语句执行完毕,会对条件表达式进行判断,如果表达式为真,则循环结束,否则重复循环,语法形式如下:
[repeat_label:] REPEAT
statement_list
UNTIL expr_condition
END REPEAT [repeat_label]
repeat_label为标注名称(可省略),直至expr_condition条件为真,才会退出循环。
7.WHILE语句
该语句创建带条件判断的循环过程,与REPEAT语句不同,WHILE 执行语句时先对表达式进行判断,如果为真则执行循环内语句,否则退出循环,语法形式如下:
[while_label:] WHILE expr_condition DO
statement_list
END WHILE [while_label]