MySQL存储过程和函数

存储过程和函数

存储过程和函数概述

存储过程和函数是 事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。

存储过程和函数的区别在于函数必须有返回值,而存储过程没有。

函数 : 是一个有返回值的过程 ;

过程 : 是一个没有返回值的函数 ;

存储过程

创建

CREATE PROCEDURE procedure_name ([proc_parameter[,...]])
begin
	-- SQL语句
end ;

示例:

delimiter $

create procedure pro_test1()
begin
	select 'Hello Mysql' ;
end$

delimiter ;

**知识小贴士 **: DELIMITER

该关键字用来声明SQL语句的分隔符 , 告诉 MySQL 解释器,该段命令是否已经结束了,mysql是否可以执行了。默认情况下,delimiter是分号;

上面的示例,如果有不替换分隔符为$,那么存储过程将会在遇见sql语句后的分号结束,存储过程并未执行完

调用

call [procedure_name]() ;

查看存储过程

-- 查询db_name数据库中的所有的存储过程
select name from mysql.proc where db=['db_name'];

-- 查询存储过程的状态信息
show procedure status;

-- 查询某个存储过程的定义
show create procedure test.pro_test1 \G;

删除

DROP PROCEDURE  [IF EXISTS] procedure_name ;

变量

声明

存储过程是可以编程的,意味着可以使用变量,表达式,控制结构 , 来完成比较复杂的功能。

通过 DECLARE 可以定义一个局部变量,该变量的作用范围只能在 BEGIN…END 块中

DECLARE var_name type [DEFAULT value]
 delimiter $

 create procedure pro_test2() 
 begin 
 	declare num int default 5;
 	select num+ 10; 
 end$

 delimiter ; 

赋值

  • 方式一:set
  • 方式二:select ... into var_name
DELIMITER $
  
  CREATE  PROCEDURE pro_test3()
  BEGIN
  	DECLARE NAME VARCHAR(20);
  	SET NAME = 'MYSQL';
  	SELECT NAME ;
  END$
  
  DELIMITER ;
DELIMITER $

CREATE  PROCEDURE pro_test5()
BEGIN
	declare  countnum int;
	select count(*) into countnum from city;
	select countnum;
END$

DELIMITER ;

传递参数

create procedure procedure_name([in/out/inout] 参数名   参数类型)
...

  • IN : 该参数可以作为输入,也就是需要调用方传入值 , 默认
  • OUT: 该参数作为输出,也就是该参数可以作为返回值
  • INOUT: 既可以作为输入参数,也可以作为输出参数

示例

--根据定义的身高变量,判定当前身高的所属的身材类型 
delimiter $

create procedure pro_test5(in height int)
begin
    declare description varchar(50) default '';
  if height >= 180 then
    set description='身材高挑';
  elseif height >= 170 and height < 180 then
    set description='标准身材';
  else
    set description='一般身材';
  end if;
  select concat('身高 ', height , '对应的身材类型为:',description);
end$

delimiter ;
--根据传入的身高变量,获取当前身高的所属的身材类型 
create procedure pro_test5(in height int , out description varchar(100))
begin
  if height >= 180 then
    set description='身材高挑';
  elseif height >= 170 and height < 180 then
    set description='标准身材';
  else
    set description='一般身材';
  end if;
  --定义了出参就不用再使用查询sql
end$ 

--调用
call pro_test5(168, @description)$
select @description$

小贴士:

  • @description : 这种变量要在变量名称前面加上@符号,叫做用户会话变量,在当前会话中有效

  • @@global.sort_buffer_size : 这种在变量前加上 @@ 符号,叫做系统变量,在MySQL所有会话中都有效

示例

--从1加到n
delimiter $

create procedure pro_test8(n int)
begin
  declare total int default 0;
  declare num int default 1;
  while num<=n do
    set total = total + num;
	set num = num + 1;
  end while;
  select total;
end$

delimiter ;
--案例:批量插入,根据次数插入到admin表中多条记录,只插入偶数次
delimiter $
CREATE PROCEDURE test_while1(IN insertCount INT)
BEGIN
	DECLARE i INT DEFAULT 0;
	a:WHILE i<=insertCount DO
		SET i=i+1;
		IF MOD(i,2)!=0 THEN ITERATE a;
		END IF;
		INSERT INTO admin(username,`password`) VALUES(CONCAT('xiaohua',	i),'0000');
	END WHILE a;
END $
CALL test_while1(100)$
  • leave:类似于break,用于跳出所在的循环
  • iterate:类似于continue,用于结束本次循环,继续下一次
  • 两者语法一样
posted @ 2021-07-29 22:36  至安  阅读(178)  评论(0编辑  收藏  举报