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 为单位

posted @ 2023-03-30 01:20  xuruiRyan  阅读(140)  评论(0编辑  收藏  举报