MySQL存储过程
基本构造
delimiter $$ #定义终止符,可据习惯更换
CREATE PROCEDURE method_name() #创建方法
BEGIN #方法体开始
SELECT 'code'; #方法体,写SQL语句
END #方法体终止
$$ #存储过程终止
基本语法
1.定义终止符
delimiter $$ #$$为自定义符,可据习惯更换
2.创建方法
CREATE PROCEDURE method()
3.方法体开始
BEGIN
4.方法体终止
END
5.调用方法
CALL method_name();
6.格式化方法
drop PROCEDURE method_name();
7.变量及赋值
1.局部变量
用户自定义,在当前 begin-end 块中有效
-
声明变量
declare var_name type [default var_value];
例:
declare nickname varchar(32);
2.用户变量
用户自定义,在当前会话(连接)中有效,类似JAVA中的全局变量
-
不需提前声明,使用即声明
@var_name
例:
set @var_name = 'var_name';
3.变量赋值
-
set 赋值
set
例:
set var_name = 'var_name';
-
into 赋值
可在其他 sql 语句中临时赋值,且可以同时给多个临时变量
into
例:
select var_name1 into @var_name2 from tables_name
8.入参出参
-
入参
in param_name type
-
出参
类似 JAVA 中返回值
out param_name type
例:
delimiter $$ CREATE PROCEDURE method ( IN parameter1 VARCHAR ( 32 ),OUT parameter2 VARCHAR ( 32 ) BEGIN SELECT parameter2 INTO @parameter2 FROM table_name WHERE parameter1 = parameter1; END $$ CALL method ( '参数1', @parameter2 ) $$ SELECT @parameter2 $$
-
inout 即可入参也可出参
inout param_name type
9.判断
1.IF
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list]
{ELSE statement_list}
END IF
2.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
10.循环
1.LOOP
[label: ]LOOP
statement_list
IF exit_condition THEN
LEAVE label;
END IF;
END LOOP label;
2.REPEAT
类似 JAVA 中的 do-while
[label: ]REPEAT
statement_list
UNTIL search_condition #直到...为止
END REPEAT;
3.WHILE
[label: ]WHILE search_condition DO
statement_list
END WHILE;
11.循环跳出、继续
1.LEAVE
跳出循环,类似 JAVA 中的 break
LEAVE label
2.ITERATE
继续本次循环
ITERATE label
游标
用游标得到某一个结果集,逐行处理数据,类似 JDBC 的ResultSet
-
声明语法
DECLARE cursor_name CURSOR FOR select_statement
-
打开语法
OPEN cursor_name
-
取值语法
FETCH cursor_name INTO var_name [,var_name]...
-
关闭语法
CLOSE cursor_name
-
handler 句柄
用于循环遍历取值时创建退出循环的exit_flag
声明变量
DECLARE exit_flag BOOLEAN DEFAULT TRUE;
声明游标
DECLARE cursor_name CURSOR FOR select_statement
声明handler
DECLARE CONTINUE HANDLER FOR NOT FOUND SET exit_flag = FALSE;
NOT FOUND:当游标无法在循环中取到值时报此错,此SQL作用原理为当接收到NOT FOUND错误时则跳出循环,也可写为错误码:1329
注意:在语法中,变量声明、游标声明、handler声明必须按照先后顺序写,否则创建存储过程出错
-
创建循环
label: LOOP FETCH cursor_name INTO var_name [,var_name]... IF exit_flag THEN SELECT var_name1,var_name2...; ELSE LEAVE label; END IF; END LOOP label;
常用函数
1.字符串拼接
CONCAT(str1,str2,...)
2.取时间差
TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)
取 datetime_expr1 - datetime_expr1 的差值,unit 为单位