MySQL 5.7.30 存储过程和函数

一、创建语法

#创建存储过程
CREATE PROCEDURE sp_name([proc_parameter[,...]])
	   [characteristic ...] routine_body

#创建函数
CREATE FUNCTION fun_name(func_parameter[,...]])
	   RETURNS type
	   [characteristic ...] routine_body

#修改存储过程或函数
ALTER {
    PROCEDURE | FUNCTION} sp_name [characteristic ...]

#调用存储过程
CALL sp_name([parameter[,...]])

--------------------------------------------参数说明 开始--------------------
1、proc_parameter: [ IN | OUT | INOUT ] param_name type 存储过程入参
2、func_parameter: param_name type  函数入参
3type:有效的MySQL数据类型
4、characteristic:
 - LANGUAGE SQL:表示此存储过程或函数的创建语言
 - [NOT] DETERMINISTIC:输入相同参数返回相同结果,反之是输入相同参数返回不同结果,默认是NOT DETERMINISTIC
 - CONTAINS SQL:子程序不包含读或写数据的语句(默认)
 - NO SQL:子程序不包含SQL语句
 - READS SQL DATA:子程序包含读数据的语句
 - MODIFIES SQL DATA:子程序包含写数据的语句
 - SQL SECURITY {
    DEFINER | INVOKER}:子程序该用创建子程序者的许可来执行,还是使用调用者的许可来执行。默认是DEFINER- COMMENT 'string':存储过程或函数的注释信息
5、routine_body:有效的SQL语句
--------------------------------------------参数说明 结束--------------------

二、删除存储过程或函数

DROP {
    PROCEDURE | FUNCTION} [IF EXISTS] sp_name

三、查看存储过程或函数

#1、查看存储过程或函数的状态,\G是格式化
SHOW {
    PROCEDURE | FUNCTION} STATUS [LIKE 'pattern'] \G 

#2、查看存储过程或者函数的定义
SHOW CREATE {
    PROCEDURE | FUNCTION} sp_name \G

#3、通过information_schema.routines了解存储过程和函数的信息
select * from information_schema.routines where routine_name = 'sp_name' \G

四、变量

#1、变量的定义
DECLARE var_name[,...] TYPE [DEFAULT value]
    declare last_month date; -- 例子

#2、变量的赋值
SET var_name = expr , var_name = expr ...
    set last_month = date_sub(current_date(), interval 1 month); -- 例子
SELECT col_name1, col_name2, ... INTO var_name1, col_name2, ... FROM dual
	select 1 into last_month from fual;  -- 例子

五、定义条件和处理

#1、条件的定义
DECLARE condition_name CONDITION FOR condition_value

#2、条件的处理
DECLARE handler_type HANDLER FOR handler_condition_value[,...] sp_statement

--------------------------------------------参数说明 开始--------------------
1、condition_value:
	- SQLSTATE[VALUE] sqlstate_value
	- mysql_error_code
2、handler_type:
	- CONTINUE
	- EXIT
	- UNDO
3、handler_condition_value:
	- SQLSTATE[VALUE] sqlstate_value
	- condition_name -- 通过条件的定义定义的
	- SQLWARNING	-- 对所有以01开头的SQLSTATE代码的速记
	- NOT FOUND		-- 对所有以02开头的SQLSTATE代码的速记
	- SQLEXCEPTION		-- 对所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE代码的速记
	- mysql_error_code	
--------------------------------------------参数说明 结束--------------------

六、光标

#1、声明光标(使用光标对结果集进行循环的处理)
DECLARE cursor_name CURSOR FOR select_statement
#2、OPEN 光标
OPEN cursor_name
#3、FETCH 光标
FETCH cursor_name INTO var_name [,var_name]...
#4、CLOSE 光标
CLOSE cursor_name

七、流程控制

#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
Or:
CASE 
	WHEN search_condition THEN statement_list
	[WHEN search_condition THEN statement_list]...
	[ELSE statement_list]
END CASE;

#3、LOOP语句
[begin_label:] LOOP
	statement_list
END LOOP [end_label]

#4、LEAVE语句(例子)
delimiter //
drop procedure if exists loop_test;
create procedure loop_test()
begin
    declare i int;
    set i = 0;
    lp : loop
        insert into payment(amount) values(i + 100);
        set i = i + 1;
        if i > 10 then
            leave lp;
        end if;
    end loop;
end //
delimiter ;

#5、ITERATE语句(例子):跳出当前循环,直接进入下一轮循环
delimiter //
drop procedure if exists loop_test;
create procedure loop_test()
begin
    declare i int;
    set i = 0;
    lp : loop
        insert into payment(amount) values(i + 100);
        set i = i + 1;
        if i = 10 then
            leave lp;
        elseif mod(i, 2) = 0 then
            iterate lp;
        end if;
    end loop;
end //
delimiter ;

#6、REPEAT语句:先执行,再判断,满足条件就退出,最少循环1次
[begin_label:] REPEAT
	statement_list
UNTIL search_condition
END REPEAT [end_label]

#7、WHILE语句:先判断,满足条件就执行,最少循环0次
[begin_label:] WHILE search_condition DO
	statement_list
END WHILE [end_label]

你可能感兴趣的:(MySQL,mysql)