返回顶部
首页 > 资讯 > 数据库 >mysql存储过程与存储函数实例分析
  • 184
分享到

mysql存储过程与存储函数实例分析

mysql 2022-11-30 23:11:54 184人浏览 独家记忆
摘要

这篇文章主要介绍了Mysql存储过程与存储函数实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mysql存储过程与存储函数实例分析文章都会有所收获,下面我们一起来看看吧。

这篇文章主要介绍了Mysql存储过程与存储函数实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mysql存储过程与存储函数实例分析文章都会有所收获,下面我们一起来看看吧。

存储过程

  • 简介

是一组经过 预先编译 的 sql 语句的封装
存储过程预先存储在 MySQL 服务器上,需要执行的时候,客户端只需要向服务器端发出调用存储过程的命令,服务器端就可以把预先存储好的这一系列 SQL 语句全部执行
  • 分类

1、没有参数(无参数无返回) 
2、仅仅带 IN 类型(有参数无返回) 
3、仅仅带 OUT 类型(无参数有返回) 
4、既带 IN 又带 OUT(有参数有返回) 
5、带 INOUT(有参数有返回)
  • 格式

DELIMITER $
CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型,...)
[characteristics ...]
BEGIN
    sql语句1;
    sql语句2;
END $

IN :当前参数为输入参数,也就是表示入参;存储过程只是读取这个参数的值。如果没有定义参数种类, 默认就是 IN ,表示输入参数
OUT :当前参数为输出参数,也就是表示出参;执行完成之后,调用这个存储过程的客户端或者应用程序就可以读取这个参数返回的值了
INOUT :当前参数既可以为输入参数,也可以为输出参数

形参类型可以是 MySQL数据库中的任意类型

characteristics 表示创建存储过程时指定的对存储过程的约束条件

1. BEGIN…END:BEGIN…END 中间包含了多个语句,每个语句都以(;)号为结束符
2. DECLARE:DECLARE 用来声明变量,使用的位置在于 BEGIN…END 语句中间,而且需要在其他语句使用之前进行变量的声明
3. SET:赋值语句,用于对变量进行赋值
4. SELECT… INTO:把从数据表中查询的结果存放到变量中,也就是为变量赋值

存储过程体中可以有多条 SQL 语句,如果仅仅一条SQL 语句,则可以省略 BEGIN 和 END

DELIMITER 新的结束标记
DELIMITER //”语句的作用是将MySQL的结束符设置为//,并以“END //”结束存储过程。存储过程定义完毕之后再使用“DELIMITER ;”恢复默认结束符
当使用DELIMITER命令时,应该避免使用反斜杠(‘\’)字符,因为反斜线是MySQL的转义字符
  • 代码案例

# 类型1:无参数无返回值
# 举例1:创建存储过程select_all_data(),查看 employees 表的所有数据
DELIMITER $     # 开始
CREATE PROCEDURE select_all_data()
BEGIN
  SELECT * FROM employees;
END $
DELIMITER;    # 结束
# 存储过程的调用
CALL select_all_data();

# 举例2:创建存储过程avg_employee_salary(),返回所有员工的平均工资
DELIMITER //
CREATE PROCEDURE avg_employee_salary()
BEGIN 
  SELECT AVG(salary) FROM employees;
END //
DELIMITER ;
# 调用
CALL avg_employee_salary();

# 举例3:创建存储过程show_max_salary(),用来查看“emps”表的最高薪资值
DELIMITER //
CREATE PROCEDURE show_max_salary()
BEGIN
  SELECT MAX(salary)
  FROM employees;
END //
DELIMITER ;
# 调用
CALL show_max_salary();

# 类型2:带 OUT
# 举例4:创建存储过程show_min_salary(),查看“emps”表的最低薪资值。并将最低薪资通过OUT参数“ms”输出
DELIMITER //
CREATE PROCEDURE show_min_salary(OUT ms DOUBLE)   # 输出ms,类型是DOUBLE
BEGIN
  SELECT MIN(salary) INTO ms    # 将min赋值给ms
  FROM employees;
END //
DELIMITER 
# 调用
CALL show_min_salary(@ms);
# 查看变量值
SELECT @ms;

# 类型3:带 IN
# 举例5:创建存储过程show_someone_salary(),查看“emps”表的某个员工的薪资,并用IN参数empname输入员工姓名
DELIMITER //
CREATE PROCEDURE show_someone_salary(IN empname VARCHAR(20))   # 传入empname,类型为VARCHAR
BEGIN
  SELECT salary FROM employees
  WHERE last_name = empname;   # 使用empname
END //
DELIMITER;
# 调用方式1
CALL show_someone_salary('Abel');
# 调用方式2
SET @empname := 'Abel';
CALL show_someone_salary(@empname);

# 类型4:带 IN 和 OUT
# 举例6:创建存储过程show_someone_salary2(),查看“emps”表的某个员工的薪资,并用IN参数empname输入员工姓名,用OUT参数empsalary输出员工薪资
DELIMITER //
CREATE PROCEDURE show_someone_salary2(IN empname VARCHAR(20), OUT empsalary DECIMAL(10,2))
BEGIN
  SELECT salary INTO empsalary   # 赋值
  FROM employees
  WHERE last_name = empname;   # 使用参数
END //
DELIMITER;
# 调用
SET @empname = 'Abel';
CALL show_someone_salary2(@empname, @empsalary);
# 查看
SELECT @empname
SELECT @empsalary;

# 类型5:带 INOUT
# 举例7:创建存储过程show_mgr_name(),查询某个员工领导的姓名,并用INOUT参数“empname”输入员工姓名,输出领导的姓名
DELIMITER $
CREATE PROCEDURE show_mgr_name(INOUT empname VARCHAR(25))
BEGIN
  SELECT last_name INTO empname
  FROM employees
  WHERE employee_id = (
        SELECT manager_id
        FROM employees
        WHERE last_name = empname
        );
END $
DELIMITER ;
#调用
SET @empname := 'Abel';
CALL show_mgr_name(@empname);
# 查看
SELECT @empname;

存储函数

  • 格式

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

1、RETURNS type 语句表示函数返回数据的类型
2、RETURNS子句只能对FUNCTION做指定,对函数而言这是 强制 的。它用来指定函数的返回类型,而且函数体必须包含一个 RETURN value 语句
3、characteristic 创建函数时指定的对函数的约束。取值与创建存储过程时相同
4、函数体也可以用BEGIN…END来表示SQL代码的开始和结束。如果函数体只有一条语句,也可以省略BEGIN…END
5、调用存储函数
      SELECT 函数名(实参列表)
  • characteristics

LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTaiNS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string

1、LANGUAGE SQL :说明存储过程执行体是由SQL语句组成的,当前系统支持的语言为SQL
2、[NOT] DETERMINISTIC :指明存储过程执行的结果是否确定。DETERMINISTIC表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。NOT DETERMINISTIC表示结果是不确定
的,相同的输入可能得到不同的输出。如果没有指定任意一个值,默认为NOT DETERMINISTIC
3、{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } :指明子程序使用SQL语句的限制
      CONTAINS SQL表示当前存储过程的子程序包含SQL语句,但是并不包含读写数据的SQL语句
      NO SQL表示当前存储过程的子程序中不包含任何SQL语句
      READS SQL DATA表示当前存储过程的子程序中包含读数据的SQL语句
      MODIFIES SQL DATA表示当前存储过程的子程序中包含写数据的SQL语句
      默认情况下,系统会指定为CONTAINS SQL
4、SQL SECURITY { DEFINER | INVOKER } :执行当前存储过程的权限,即指明哪些用户能够执行当前存储过程
      DEFINER 表示只有当前存储过程的创建者或者定义者才能执行当前存储过程;
      INVOKER 表示拥有当前存储过程的访问权限的用户能够执行当前存储过程。
      如果没有设置相关的值,则MySQL默认指定值为DEFINER
5、COMMENT 'string' :注释信息,可以用来描述存储过程
  • 代码案例

# 举例1:创建存储函数,名称为email_by_name(),参数定义为空,该函数查询Abel的email,并返回,数据类型为字符串型
DELIMITER //    # 开始
CREATE FUNCTION email_by_name()
RETURNS VARCHAR(25)   # 返回值
  DETERMINISTIC   # 表示结果确定
  CONTAINS SQL    # 表示包含sql语句
  READS SQL DATA    # 表示包含读数据的sql
BEGIN
  RETURN (SELECT email FROM employees WHERE last_name = 'Abel');
END //
DELIMITER;    # 结束
# 调用
SELECT email_by_name();

# 举例2:创建存储函数,名称为email_by_id(),参数传入emp_id,该函数查询emp_id的email,并返回,数据类型为字符串型
# 创建函数前执行此语句,保证函数的创建会成功;则不需要写characteristics
SET GLOBAL log_bin_trust_function_creators = 1;
# 声明函数
DELIMITER //    # 开始
CREATE FUNCTION email_by_id(emp_id INT)  # 传入参数
RETURNS VARCHAR(25)   # 返回值
BEGIN
  RETURN (SELECT email FROM employees WHERE employee_id = emp_id);  # 使用emp_id
END //
DELIMITER;
# 调用
SELECT email_by_id(101);
# 调用方式2
SET @emp_id := 102;
SELECT email_by_id(@emp_id);

# 举例3:创建存储函数count_by_id(),参数传入dept_id,该函数查询dept_id部门的员工人数,并返回,数据类型为整型。
DELIMITER //
CREATE FUNCTION count_by_id(dept_id INT)
RETURNS INT
BEGIN
  RETURN (SELECT COUNT(*) FROM employees WHERE department_id = dept_id);
END //
DELIMITER ;
# 调用
SET @dept_id := 50;
SELECT count_by_id(@dept_id);
  • 存储过程、存储函数的查看

# 方式1:使用SHOW CREATE语句查看存储过程和函数的创建信息
# 查看存储过程
SHOW CREATE PROCEDURE show_mgr_name;
# 查看存储函数
SHOW CREATE FUNCTION count_by_id;

# 方式2:使用SHOW STATUS语句查看存储过程和函数的状态信息
# 查看存储过程
SHOW PROCEDURE STATUS;
# 查看指定存储过程
SHOW PROCEDURE STATUS LIKE 'show_max_salary';
# 查看指定存储函数
SHOW FUNCTION STATUS LIKE 'email_by_id';

# 方式3:从infORMation_schema.Routines表中查看存储过程和函数的信息

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_salary' AND ROUTINE_TYPE = 'PROCEDURE';
  • 存储过程、函数的修改

ALTER PROCEDURE show_max_salary
SQL SECURITY INVOKER
COMMENT '查询最高工资';
  • 存储过程、函数的删除

DROP FUNCTION IF EXISTS count_by_id;

DROP PROCEDURE IF EXISTS show_min_salary;

关于“mysql存储过程与存储函数实例分析”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“mysql存储过程与存储函数实例分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: mysql存储过程与存储函数实例分析

本文链接: https://lsjlt.com/news/173715.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • mysql存储过程与存储函数实例分析
    这篇文章主要介绍了mysql存储过程与存储函数实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mysql存储过程与存储函数实例分析文章都会有所收获,下面我们一起来看看吧。...
    99+
    2022-11-30
    mysql
  • MySQL的存储函数与存储过程实例代码分析
    这篇文章主要介绍了MySQL的存储函数与存储过程实例代码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL的存储函数与存储过程实例代码分析文章都会有所收获,下面我们一...
    99+
    2023-03-06
    mysql
  • MySQL存储过程与函数的案例分析
    这篇文章将为大家详细讲解有关MySQL存储过程与函数的案例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。        &nb...
    99+
    2024-04-02
  • MySQL中存储过程和存储函数的示例分析
    这篇文章主要为大家展示了“MySQL中存储过程和存储函数的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL中存储过程和存储函数的示例分析”这篇文...
    99+
    2024-04-02
  • MYSQL中存储过程与函数的示例分析
    这篇文章主要介绍了MYSQL中存储过程与函数的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。  一、模式  二、存储过程与存储函数 ...
    99+
    2024-04-02
  • MySQL的存储过程实例分析
    今天小编给大家分享一下MySQL的存储过程实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一...
    99+
    2024-04-02
  • MySQL的存储函数与存储过程的区别解析
    MySQL存储函数(自定义函数),函数一般用于计算和返回一个值,可以将经常需要使用的计算或功能写成一个函数。 存储函数和存储过程一样,都是在数据库中定义一些 SQL 语句的集合。 存...
    99+
    2024-04-02
  • 关于MySQL的存储过程与存储函数
    目录初识存储过程存储过程语法存储过程调用存储函数的使用语法函数的调用对比存储函数和存储过程初识存储过程 理解:含义: 存储过程(Stored Procedure)是在大型数据库系统中...
    99+
    2023-05-19
    MySQL存储过程 MySQL存储函数
  • oracle中存储函数与存储过程的示例
    这篇文章主要介绍了oracle中存储函数与存储过程的示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一:存储过程:简单来说就是有名字的pl...
    99+
    2024-04-02
  • mysql存储过程举例分析
    这篇文章主要讲解了“mysql存储过程举例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql存储过程举例分析”吧!(1).格式MySQL存储过程创...
    99+
    2024-04-02
  • mysql存储过程用法实例分析
    本文实例讲述了mysql存储过程用法。分享给大家供大家参考,具体如下: 概述: 简单的说,就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法; 存储过程跟触发器有点类...
    99+
    2024-04-02
  • MySQL之存储过程和函数的示例分析
    这篇文章将为大家详细讲解有关MySQL之存储过程和函数的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、变量系统变量系统变量分为全局变量和会话变量,是由系统提供...
    99+
    2024-04-02
  • mysql存储过程的案例分析
    这篇文章主要介绍mysql存储过程的案例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、什么是存储过程为以后的使用而保存的一条或多条MySQL语句的集合。存储过程思想上就是数据...
    99+
    2024-04-02
  • 创建存储函数、删除存储函数及 存储函数与存储过程的区别
    之前,我们列举不少mysql自带的函数,但是有些时候自带函数并不能很好满足我们的需求,此时就需要自定义存储函数了,存储函数与存储过程有些类似,简单来说就是封装一段sql代码,完成一种特定的功能,并返回结果。其语法如下: CREATE FUN...
    99+
    2022-02-07
    创建存储函数 删除存储函数及 存储函数与存储过程的区别
  • 浅谈MYSQL存储过程和存储函数
    目录1. 什么是存储过程和存储函数?2. 创建存储过程3. 创建存储函数4. 存储过程和存储函数的使用5. 带有if语句的存储过程6. 带有循环语句的存储过程7. 带有事务的存储过程8. 带有游标的存储函数9. 存储过程...
    99+
    2023-05-05
    MYSQL存储过程 MYSQL 存储函数
  • MySQL的存储函数与存储过程相关概念与具体实例详解
    目录MySQL存储过程与存储函数的相关概念存储过程存储函数存储函数与存储过程的对比存储过程和函数的查看修改删除MySQL存储过程与存储函数的相关概念 存储函数和存储过程的主要区别: ...
    99+
    2023-03-01
    MySQL的存储函数与存储过程 MySQL存储过程 MySQL存储函数
  • MySQL调用存储过程和函数的示例分析
    这篇文章主要介绍了MySQL调用存储过程和函数的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。存储过程和函数有多种调用方法。存储过程...
    99+
    2024-04-02
  • Sql Server存储过程实例分析
    今天小编给大家分享一下Sql Server存储过程实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。从存储过程...
    99+
    2023-06-30
  • mysql存储过程与存储函数的区别有哪些
    这篇文章主要讲解了“mysql存储过程与存储函数的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mysql存储过程与存储函数的区别有哪些”吧! ...
    99+
    2024-04-02
  • MySQL存储函数与存储过程的区别是什么
    这篇“MySQL存储函数与存储过程的区别是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL存储函数与存储过程的区...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作