【Mysql 存储过程 Or 存储函数 傻傻分不清? 】

这篇具有很好参考价值的文章主要介绍了【Mysql 存储过程 Or 存储函数 傻傻分不清? 】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MySQL的存储函数(自定义函数)和存储过程都是用于存储SQL语句的。但是什么时候用什么呢?是不是总是傻傻的分不清?
本文来详细的讲一下存储函数 和存储过程 ,以后再也不会迷糊。

一、 异同点

MySQL的存储过程和函数都是一系列SQL语句的集合,调用时一次性执行这些SQL语句。但是它们有一些不同之处:

  1. 存储过程没有返回值,而函数有一个返回值.
  2. 存储过程可以在单个存储过程中执行一系列SQL语句,而自定义函数有诸多限制.
  3. 存储过程可以返回多个值,而函数只能有一个返回值.
  4. 存储过程实现较为复杂,自定义函数针对性强
  5. 存储函数只能有输入参数,而且不能带in, 而存储过程可以有多个in,out,inout参数。
  6. 存储过程可以调用存储函数、但函数不能调用存储过程。
名称 创建 调用 返回 应用
存储函数 create function select 只能是一个 计算字段值、处理数据、触发器(一般用于查询结果为一个值并有返回结果的)
存储过程 create procedure call 可以是多个也可以为空 1.复杂的业务逻辑,例如银行转账、订单处理;2.批量操作,例如批量插入、更新、删除数据;3.安全性控制,例如限制用户访问某些数据或执行某些操作(一般用于更新)

二、 存储函数

存储函数(自定义函数)是一种对MySQL扩展的途径,其用法与内置的函数相同。

语法

创建

CREATE FUNCTION 函数名([func_parameter[…]])
RETURNS type
[characteristic …]
BEGIN
函数体
– sql语句
END
函数名:表示存储函数的名称;
func_parameter:表示存储函数的参数列表,指定参数为IN、OUT或INOUT只对PROCEDURE是合法的,FUNCTION中总是默认为IN参数。
RETURNS type:语句表示函数返回数据的类型;
characteristic:创建函数时指定的对函数的约束。
func_parameter :由参数名称和参数类型组成。
函数体:函数主体,包含函数逻辑和SQL语句.

示例:

delimiter $$
CREATE FUNCTION avg_salary(p_name VARCHAR(50))

RETURNS FLOAT

BEGIN

    DECLARE avg_age FLOAT;

    DECLARE total_salary FLOAT;

    DECLARE num_employees INT;

    DECLARE cur CURSOR FOR SELECT age FROM employees WHERE name = p_name;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET num_employees = 0;

    OPEN cur;

    FETCH cur INTO avg_age;

    CLOSE cur;



    SELECT AVG(salary) INTO total_salary FROM employees WHERE name = p_name;



    RETURN total_salary / avg_age;

end $$

delimiter ;

上述示例存储函数接受一个参数p_name,表示要查询的员工姓名。它首先声明了三个变量:avg_age、total_salary和num_employees。然后,它使用游标遍历employees表中与指定名称匹配的所有行,并计算这些行中的平均年龄。最后,它返回总薪水除以平均年龄的结果。

> delimiter 是分隔符的意思 DELIMITER xx
> -- 示例:
>  DELIMITER $$   -- 指定 $$ 为分隔符
>  DELIMITER //   -- 指定 // 为分隔符 
>  DELIMITER ;    -- 指定 ; 为分隔符

调用

SELECT func_name()

调用函数名。

查看

查看定义: show create function func_name;
查看状态:show function status like ‘func_name’;

修改

ALTER FUNCTION function_name(parameters) [characteristic …];

删除

DROP FUNCTION func_name

删除函数的语法只需写上函数名即可,函数的参数可以不用写出来。


三、 存储过程

存储过程是一组为了完成特定功能的SQL语句集合,经编译后存储在服务器端的数据库中,利用存储过程可以加速SQL语句的执行
存储过程的优点是可以提高运行效率,且使用存储过程的系统更加稳定。
存储过程的缺点是维护性较差,相对于简单SQL,存储过程的编写和调试都比较困难。

语法

创建
存储过程的创建步骤需要以下几步:

  1. 声明存储过程的名称和参数列表。
  2. 编写存储过程的主体部分,包括一系列SQL语句。
  3. 结束存储过程的主体部分,并指定返回值类型。
  4. 调用存储过程,传递参数并获取返回结果。

create procedure 存储过程名 ([params])
BEGIN
存储过程体(一组合法的SQL语句)
END
参数列表(params):如果有多个参数则用逗号 , 分隔开,一个参数包括三部分:参数模式、参数名、参数类型,如:in name varchar(20)。参数模式有:in 输入、out 输出、inout 输入输出参数。
关于IN | OUT | INOUT的详情如下:
IN :表示输入参数;它必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值。仅需要将数据传入存储过程,并不需要返回计算后的该值。只能当做传入参数
OUT: 表示输出参数;该值可在存储过程内部被改变,并可返回。不接受外部传入的数据,仅返回计算之后的值。只能当做转出参数。也就是说,即使传值给 OUT 参数,该参数也无法得到你传的值,得到的会是一个 null 值。
INOUT 表示既可以输入也可以输出;该参数即可作为输入,又可做为输出,也就是该参数既需要传入值,又可以返回值。可当做传入转出参数

示例:

CREATE PROCEDURE GetEmployeeDetails(IN employeeID INT)

BEGIN

    SELECT * FROM employees WHERE ID = employeeID;

END;


上述示例为一个名为GetEmployeeDetails的存储过程,接受一个整型参数employeeID,用于查询员工详情。在存储过程中,使用SELECT语句从employees表中查询employeeID对应的记录。最后,通过END关键字结束存储过程的主体部分。

调用
使用 call 关键字来调用存储过程

call func_name([ proc_parameter [,proc_parameter …]])
当无参数时,可以省略括号,不写;
当有参数时,不可省略括号。

查看

查看定义: show create procedurefunc_name;
查看状态:show procedurestatus like ‘func_name’;

修改

alter procedure sp_name [characteristic …]

删除

drop procedure sp_name;

其中characteristic的取值为:

说明
language sql 说明routine_body部分是由SQL语句组成的,当前系统支持的语言为SQL
[not] deterministic 指明存储过程执行的结果是否确定。DETERMINISTIC 表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。
{contains sql / no sql / reads sql data / modifies sql data} 指明子程序使用SQL语句的限制。CONTAINS SQL表明子程序包含SQL语句,但是不包含读写数据的语句;NO SQL表明子程序不包含SQL语句;READS SQL DATA:说明子程序包含读数据的语句;MODIFIES SQL DATA表明子程序包含写数据的语句。默认情况下,系统会指定为CONTAINS SQL。
sql_security{definer/invoker} 指明谁有权限来执行。DEFINER 表示只有定义者才能执行;INVOKER 表示拥有权限的调用者可以执行。默认情况下,系统指定为DEFINER。
comment ‘string’ 注释信息,可以用来描述存储过程或函数

【Mysql 存储过程 Or 存储函数 傻傻分不清? 】文章来源地址https://www.toymoban.com/news/detail-490515.html

  如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏  🙌一起讨论
  你的评价就是我✍️创作的动力!					  💞💞💞

到了这里,关于【Mysql 存储过程 Or 存储函数 傻傻分不清? 】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CPython, Pypy, MicroPython...还在傻傻分不清楚?

    哈喽大家好,我是咸鱼 当我们说 Python 时,通常指的是官方实现的 CPython 但还有很多比如 Pypy、Jython、MicroPython、Brython、RustPython 等 “python” 许多小伙伴看到这些带 “python” 的概念可能一头雾水,心想这跟我平时接触到的 python 有什么区别吗?这些到底是什么 那么今天这篇

    2024年02月12日
    浏览(37)
  • Java empty、null、blank 还傻傻分不清楚?

    写代码时候经常遇到判empty、null和blank的情况。这些概念看起来很相似,但是它们有着不同的含义和用法。本文将介绍这三个概念的区别,并分析具体场景该如何做判断。 empty是指一个字符串长度为0/Java集合对象不存在元素,可以使用isempty()方法来判断一个字符串是否为空。

    2024年02月06日
    浏览(58)
  • VR、AR、MR 傻傻分不清楚?区别的底层逻辑?

    VR是一种能够制作虚拟物体并与人互动的基础技术。它与操作者所处的环境无关。 AR可以让在特定位置出现或消失。 MR可以让虚拟物体与真实物体进行互动。 AR和MR的大部分应用场景都是随机的,所以硬件基本都采用手机和眼镜。提升了便携性。牺牲了性能。这就导致了AR与

    2024年02月11日
    浏览(49)
  • 备赛ing!美赛MCM和ICM还傻傻分不清楚?

    写在前面 想参加美赛为保研加分但不了解美赛? 不用慌张! 今天就来为大家介绍一下 美赛中MCM和ICM的区别 ,以及它们都是 适合于哪些人群参加 ,希望能够对大家有所帮助。 作为 世界范围内最具影响力的数学建模竞赛 ,美赛全称是美国大学生数学建模竞赛(也称为世界大

    2024年01月24日
    浏览(42)
  • 汽车虚拟ECU和MCU硬件虚拟化,傻傻分不清楚

    目录 1.概述 2.汽车虚拟ECU 3.汽车MCU虚拟化功能 4.小结 近几年,随着智能网联汽车普及,车型的更新迭代速度进一步提升,功能开发工程师希望在能够在硬件成型前验证软件功能,意味着汽车控制器的功能开发也在不断左移。 为此业内出现了对ECU进行虚拟化以加速开发的呼声

    2024年01月25日
    浏览(47)
  • VR、AR、MR、CR,虚拟现实傻傻分不清楚

    感觉不知道什么是VR就OUT了 其实除了VR之外,还有AR、MR、CR等外形类似 技术含量更高的头戴式设备,那么问题来了,这些*R们有哪些区别?   vr是由美国VPL公司创建人拉尼尔(Jaron Lanier)在20世纪80年代初提出的。其具体内涵是:综合利用计算机图形系统和各种现实及控制等接口

    2024年02月08日
    浏览(40)
  • Mysql 存储过程 / 存储函数

    目录 0 课程视频 1 基本语法 1.0 作用 -在数据库中 封装sql语句 - 复用 - 减少网络交互 -可接收参数返回数据 1.1 创建 1.2 调用 1.3 查看 1.4 删除 1.5 ; 封号结束符 改成 $$ 双刀符合结束语句 - 因为打包封号结束有冲突 1.6 在cmd 中定义 存储过程 打包的事务 - 打包完 可以改回 封号  

    2024年02月01日
    浏览(54)
  • 数据中台、数据平台、数据湖、数据仓库傻傻分不清楚?带你一文理清

    随着数字经济蓬勃发展,数字化转型步伐不断加快,大数据技术的不断更新与迭代,数据技术加速创新融合应用,在数字化发展的不同阶段,数据管理工具历经了从数据库、数据仓库、数据集市与数据湖,再到大数据平台与如今的数据中台的发展历程。大数据平台、数据湖、

    2024年04月26日
    浏览(39)
  • java,jdk 分不清,是否免费,怎么选择合适的版本

    Oracle JDK 和 Open JDK Oracle JDK Open JDK 来源 Oracle团队维护 Oracle和Open Java社区 授权协议 Java 17及更高版本 Oracle Java SE 许可证Java16及更低版本甲骨文免费条款和条件 (NFTC) 许可协议 (oracle.com) GPL v2许可证 关系 由Open JDK构建,增加了少许内容 发行周期 6个月,每两年一个LTS 6个月 是否收费

    2024年02月07日
    浏览(63)
  • MySQL(视图,存储函数,存储过程)

    作业1:  作业实现: 首先创建学生表,课程表,以及学生选课表。  1.用SQL语句创建学生表student,定义主键,姓名不能重名,性别只能输入男或女,所在系的默认值是 “计算机”。 2.修改student 表中年龄(age)字段属性,数据类型由int 改变为smallint。 3.为SC表建立按学号(

    2024年01月21日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包