服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - MySQL的存储函数与存储过程相关概念与具体实例详解

MySQL的存储函数与存储过程相关概念与具体实例详解

2023-03-02 16:01瀛台夜雪 Mysql

MySQL存储函数(自定义函数),函数一般用于计算和返回一个值,可以将经常需要使用的计算或功能写成一个函数,存储函数和存储过程一样,都是在数据库中定义一些SQL语句的集合

MySQL存储过程与存储函数的相关概念

存储函数和存储过程的主要区别:

  • 存储函数一定会有返回值的
  • 存储过程不一定有返回值

存储过程和函数能后将复杂的SQL逻辑封装在一起,应用程序无需关注存储过程和函数内部复杂的SQL逻辑,而只需要简单地调用存储过程和函数即可

存储过程

一组预先编译的SQL语句的封装

执行过程:执行过程预先存储在MySQL服务器上,需要执行的时候,客户端只需要向服务器发出调用存储过程的命令,服务器端就可以把预先存储好的这一系列SQL语句全部执行

  • 简化操作,提高了SQL语句的重用性,减少了开发程序员的压力
  • 减少操作过程中的失误,提高效率
  • 减少网路传输量,客户端不需要将所有的SQL语句通过网络发给服务器
  • 减少SQL语句暴露在网上的风险,提高数据查询的安全性

与视图,函数的对比:

  • 视图:是虚拟表,通常不对底层数据表直接操作
  • 存储过程:程序化的SQL,可以直接操作底层数据表,相比于面向集合的操作方式,能够实现一些更复杂的数据处理
  • 相较于函数,存储过程没有返回值

分类

  • 没有参数(无参数无返回)
  • 仅仅带有IN 类型 (有参数无返回)
  • 仅仅带OUT类型(无参数有返回)
  • 即带IN又带OUT(有参数有返回)
  • 带INOUT(有参数有返回)

创建存储过程

DELIMITER $

CREATE PROCEDURE 存储过程名 (IN|OUT|INOUT 参数名 参数类型,...)
[characteristics]
BEGIN
存储过程体
END $

DELIMITER ;

?
1
2
3
4
5
6
7
DELIMITER $
CREATE PROCEDURE select_all_data()
BEGIN
    SELECT *
    FROM employees;
END $
DELIMITER ;

调用存储过程

?
1
CALL select_all_data();

无参数无返回值

?
1
2
3
4
5
6
7
DELIMITER //
CREATE PROCEDURE avg_employee_salary()
BEGIN
    SELECT AVG(salary) FROM emp;
END //
DELIMITER ;
CALL avg_employee_salary();

无参数有返回值

?
1
2
3
4
5
6
7
8
9
DELIMITER //
CREATE PROCEDURE show_min_salart(OUT ms DOUBLE)
BEGIN
    SELECT MIN(salary) INTO ms
    FROM emp;
END //
DELIMITER ;
CALL show_min_salart(@ms);
SELECT @ms;

有参数无返回值

?
1
2
3
4
5
6
7
8
9
10
11
DELIMITER //
CREATE PROCEDURE show_someone_salary(IN empname VARCHAR(20))
BEGIN
    SELECT salary
    FROM emp
    WHERE last_name=empname;
END //
DELIMITER ;
CALL show_someone_salary('Abel');
SET @empname='Abel';
CALL show_someone_salary(@empname)

有参数有返回值

?
1
2
3
4
5
6
7
8
9
10
11
DELIMITER //
CREATE PROCEDURE show_someone_salary2(IN empname VARCHAR(20),OUT empsalary DECIMAL(10,2))
BEGIN
    SELECT salary INTO empsalary
    FROM emp
    WHERE last_name=empname;
END //
DELIMITER ;
SET @empname='Abel';
CALL show_someone_salary2(@empname,@empsalary);
SELECT @empsalary;

带INOUT

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DELIMITER //
CREATE PROCEDURE show_mgr_name(INOUT empname VARCHAR(25))
BEGIN
SELECT last_name
FROM emp
Where employee_id=
(
    SELECT manager_id
    FROM emp
    WHERE last_name=empname
);
END //
DELIMITER ;
SET @empname='Abel';
CALL show_mgr_name(@empname);
SELECT @empname;

如何调试

通过SELECT语句,把程序执行的中间结果查询出来,从而调试一个SQL语句的正确性。调试成功之后,把SELECT语句后移到下一个SQL语句,逐步推进查询下一个 SQL语句

存储函数

MySQL允许用户自定义函数,自定义好了之后,调用方式与调用MySQL预定义的系统函数一样

创建存储函数

CREATE FUNCTION 函数名(参数名 参数类型)
RETURUNS 返回值类型
[characteristics]
BEGIN 
    函数体 #函数体中肯定有RETURN语句
END

  • 参数类型,FUNCTION 中总是默认为IN参数
  • RETURNS type 表示函数返回数据的类型,对于函数而言是强制的
  • characteristics 表示创建函数时指定的对函数的约束
  • 函数题可以用BEGIN … END表示SQL代码的开始和结束。如果函数体只有一条语句,则可以省略BEGIN … END

调用存储函数

SELECT 函数名(实参列表)

练习一

?
1
2
3
4
5
6
7
8
9
10
11
12
13
DELIMITER //
CREATE FUNCTION email_by_name()
RETURNS VARCHAR(25)
BEGIN
RETURN
(
    SELECT email
    FROM emp
    WHERE last_name='Abel'
);
END //
DELIMITER ;
SELECT email_by_name();

练习2

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DELIMITER //
CREATE FUNCTION email_by_id(emp_id INT)
RETURNS VARCHAR(25)
BEGIN
RETURN
(
    SELECT email
    FROM emp
    WHERE employee_id=emp_id
);
END //
DELIMITER ;
SELECT email_by_id(101);
SET @emp_id=102;
SELECT email_by_id(@emp_id);

存储函数与存储过程的对比

  • 存储过程 PEOCEDURE 存储函数 FUNCTION
  • 调用语法 CALL 存储过程 SELECT 存储函数
  • 存储过程返回值可以有0个或对各 存储函数返回值只有一个
  • 存储过程一般用于更新操作 存储函数一般用于查询结果为一个值并返回
  • 存储函数可以放在查询语句中使用,存储过程则不行
  • 存储过程功能更为强大,包括能够执行对表的操作(创建表,删除表)和事务操作,这些功能是存储函数并不具备的

存储过程和函数的查看修改删除

查看

使用SHOW CREATE 语句 查看创建信息

?
1
2
SHOW CREATE PROCEDURE show_mgr_name\G;
SHOW  CREATE FUNCTION email_by_id\G;

使用SHOW STATUS 语句查看存储过程和函数的状态信息

?
1
2
3
SHOW PROCEDURE STATUS;
SHOW PROCEDURE STATUS LIKE 'show_mgr_name' ;
SHOW FUNCTION STATUS LIKE 'email_by_name' ;

从information_schema.Routines表中查看存储过程和函数的信息

?
1
2
3
4
SELECT * FROM information_schema.ROUTINES
WHERE ROUTINE_NAME='email_by_id' AND ROUTINE_TYPE='FUNCTION';
SELECT * FROM information_schema.ROUTINES
WHERE ROUTINE_NAME='show_min_salart' AND ROUTINE_TYPE='PROCEDURE';

修改存储过程与函数

修改存储过程或函数,不影响存储过程或函数功能,只是修改相关特征,使用ALTER语句实现

?
1
ALTER PROCEDURE|FUNCTION 存储过程或函数名 [characteristic ...]

删除存储过程或函数

?
1
DROP PROCEDURE|FUNCTION [IF EXISTS] 存储过程或函数名

到此这篇关于MySQL的存储函数与存储过程相关概念与具体实例详解的文章就介绍到这了,更多相关MySQL的存储函数与存储过程内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/sxycylq/article/details/129226240

延伸 · 阅读

精彩推荐
  • MysqlMysql查询优化之IN子查询优化方法详解

    Mysql查询优化之IN子查询优化方法详解

    项目中有需要,使用MySQL的in子查询,查询符合in子查询集合中条件的数据,但是没想到的是,MySQL的in子查询会如此的慢,让人无法接受,下面这篇文章主要给大家介...

    云深n不知处3332023-02-14
  • Mysqlmysql ON DUPLICATE KEY UPDATE重复插入时更新方式

    mysql ON DUPLICATE KEY UPDATE重复插入时更新方式

    这篇文章主要介绍了mysql ON DUPLICATE KEY UPDATE重复插入时更新方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    home1989797172022-07-11
  • MysqlMySQL 逻辑备份与恢复测试的相关总结

    MySQL 逻辑备份与恢复测试的相关总结

    数据库逻辑备份就是备份软件按照我们最初所设计的逻辑关系,以数据库的逻辑结构对象为单位,将数据库中的数据按照预定义的逻辑关联格式一条一条生...

    白日梦工厂厂长8312021-07-14
  • Mysql深入SQLite基本操作的总结详解

    深入SQLite基本操作的总结详解

    本篇文章是对SQLite的基本操作进行了总结和介绍。需要的朋友参考下 ...

    MYSQL教程网4022019-12-25
  • MysqlCentOS 6.5 i386 安装MySQL 5.7.18详细教程

    CentOS 6.5 i386 安装MySQL 5.7.18详细教程

    这篇文章主要介绍了CentOS 6.5 i386 安装MySQL 5.7.18详细教程,需要的朋友可以参考下 ...

    MYSQL教程网2762020-07-24
  • MysqlMySQL 分库分表的项目实践

    MySQL 分库分表的项目实践

    当用户量级上升,写请求越来越多,这时需要用到分库分表,本文就介绍了MySQL 分库分表的项目实践,具有一定的参考价值,感兴趣的可以了解一下...

    BugMaker-shen4892022-10-18
  • MysqlC++连接使用MySQL的方法

    C++连接使用MySQL的方法

    这篇文章主要为大家详细介绍了C++连接使用MySQL的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    AntiFancy4172020-07-31
  • MysqlMysql5.7修改root密码教程

    Mysql5.7修改root密码教程

    今天小编就为大家分享一篇关于Mysql5.7修改root密码教程,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    炫酷飞扬2882019-06-04