在MySQL数据库中,存储程序可以分为存储过程和存储函数,用于简化开发人员开发应用程序的工作量,而且对于存储过程和函数中SQL语句的变动,无需修改上层应用程序的代码。
存储过程和存储函数都是一系列SQL语句的集合,它们被封装之后保存到数据库中。
应用程序调用存储过程只需要通过CALL关键字并指定存储过程的名字和参数即可; |
应用程序调用存储函数只需要通过SELECT关键字并指定存储函数的名称和参数即可。 |
存储过程和存储函数的区别:
1.存储过程可以有多个或者没有返回值,存储函数则有且只有一个返回值;
2.存储过程的参数类型可以是IN、OUT和NOUT,存储函数的参数类型只能是IN;
IN:代表输入参数,需要由调用者传递实际参数,默认;
OUT:代表输出参数,该参数可作为返回值;
INOUT:代表既可以作为输入参数,也可以作为输出参数。
3.存储过程中的语句功能更强大,可以实现很复杂的业务逻辑,而函数有很多限制,比如不能在函数中使用INSERT,UPDATE,DELETE,CREATE等语句;
4.存储函数实现的功能性强;
5.存储过程可以调用存储函数,但是函数不能调用存储过程;
6.存储过程是一个比较独立的部分,而函数则可以作为查询语句的一个部分来调用。
存储过程:
创建存储过程:
DELIMITER关键字:用来声明sql语句的分隔符,告诉MySQL该命令已经结束
SQL语句默认的分隔符是分号,但是有时候我们需要一条功能SQL语句中包含分号,但是并不作为结束标识,这时候就可以使用DELIMITER来指定分割符号。
# 修改分隔符为$ DELIMITER $ #标准语法 CREATE PROCEDURE 存储过程名称([IN|OUT|INOUT] 参数名 数据类型) BEGIN sql语句; END$ #修改分隔符为分号 DELIMITER ; |
#调用存储过程 CALL 存储过程名称(实际参数); |
#删除存储过程 DROP PROCEDURE [IF EXISTS] 存储过程名称; |
DECLARE 变量名 数据类型 [DEFAULT 默认值];
DECLARE定义的是局部变量,只能用在BEGIN END范围之内
存储函数:
CREATE FUNCTION func_name([param_name type[……]])# func_name是存储函数的名称,param_name type指定存储函数的参数,type参数用于指定存储函数的参数类型,该类型可以是MySQL数据库中所有支持的类型。 RETURNS TYPE#指定返回值的类型 [CHARACTERISTIC ...]#指定存储函数的特性 BEGIN routine_body#SQL代码内容 RETURN 结果; END; 调用存储函数: SELECT func_name(); 删除存储函数: DROP FUNCTION 函数名称; |
例子:
DELIMITER $ CREATE FUNCTION func1()#获取学生表中成绩大于95分的学生数量 RETURNS int BEGIN DECLARE result INT; SELECT COUNT(*) INTO result FROM student WHERE score>95; RETURN result; END$ DELIMITER ; |