注意:delimter $$声明一个结束符,否则以;为结束符
主意:在SQL语句中声明变量且进行赋值时要使用default
1.变量及赋值
局部变量:用户自定义,在begin/end块中有效
声明变量:declare var_name type [default var_value]
举例:declare nickname varchar(32);
--set 赋值 --into赋值
用户变量:用户自定义,当前会话(连接)有效。类比java的成员变量
语法:@var_name,不需要提前声明,使用即声明
会话变量:由系统提供,当前会话连接有效
语法:@@session.var_name
全局变量:由系统提供,整个mysql的服务有效
语法:@@global.var_name
2.入参出参
in|out | inout param_name type
3.流程控制
3.1判断
IF语法:
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list]...
[ELSE statement_list]
END IF
CASE语法:此语法不仅可以用在存储过程,查询语句也可以用
语法—(类比java的switch)
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list]...
[ELSE statment_list]
END CASE
语法二
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list]...
[ELSE statement_list]
END CASE
3.2循环
loop循环: 死循环
【begin_label:】LOOP
statement_list
END LOOP [end_label]
说明:loop是死循环,需要手动退出循环,我们可以使用leave来退出
repeat循环:
【begin_label:】 REPEAT
statement_list
UNTIL search_condition --直到...为止
END REPEAT [end_label]
while循环(类比java的while(){}):
[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_lable]
3.3流程控制-退出、继续、循环
leave 相当于java中的break
iterate 相当于java中的continue
4.游标
用游标得到某一个结果集,逐行处理数据
类比jdbc的ResultSet
--声明语法
DECLARE cursor_name CURSOR FOR select_statement
--打开语法
OPEN cursor_name
--取值语法
FETCH cursor_name INTO var_name[,var_name]...
--关闭语法
CLOSE cursor_name
5.存储过程中的handler
语法:DECLARE handler_action HANDLER
FOR condition_value[,condition_value]...
statement
handler_action:{
CONTINUE | EXIT | UNDO
}
condition_value{
mysql_erroe_code
| SQLSTATE [VALUE] sqlstate_value
| condition_name
| SQLWARNING
| NOT FOUND
| SQLEXCEPTION
}
特别注意:在语法中,变量声明、游标声明、handler声明必须按照先后顺序写的,否则创建存储过程出错
注意:字符串拼接SQL语句需要预编译,当在mysql中使用prepare预编译拼接的字符串时不可以使用局部变量
创建临时表收集数据使用:create temporary table
`table_name`(字段)COLLATE = 'utf8_general_ci'
ENGINE=InnoDB;