MySQL:存储函数和存储过程

系列文章目录

1.MySQL编程基础

2.程序控制流语句

3.存储过程

4.游标

5.嵌入式SQL


文章目录

  • 系列文章目录
  • 前言
  • 一、程序控制流语句:
  • 二、存储函数:
    • 1.存储函数的特点:
    • 2.存储函数的定义:
    • 3.调用存储函数
  • 三、存储过程:
    • 1.存储过程的特点:
    • 2.存储过程的定义:
    • 3. 调用存储过程:
  • 四、两者区别:
  • 总结


前言

      前面我们简单学习了一些SQL的基本语句,增删改查等一些常用的知识,现在我们要稍微学习一点数据库编程的内容,在一些复杂的程序中我们就需要一些语句来增强这个程序的可读性和逻辑性,下面我们先讲讲存储函数和存储过程:


一、程序控制流语句:

    与所有的程序设计语言一样,MySQL提供了用于编写过程化代码的语法结构,可进行顺序,分支,循环,存储过程,存储函数,触发器等程序设计,编写结构化的模块代码,并放置到数据库服务器上。

   语句块,注释和重置命令结束标记:

        1.语句块:

 BEGIN···END用于定义SQL语句块,其语法格式如下:

       

BEGINSQL语句|SQL语句块
END

        说明:

   (1)BEGIN····END语句块包含了该程序块的所有处理操作,允许语句块嵌套。

   (2)在MySQL中单独使用BEGIN···END语句块没有任何意义,只有将其封装到存储过程,存储函数,触发器等存储程序内部才有意义。

       2.注释

     在源代码中加入注释便于用户对程序的更好理解,有两种声明注释的方式,即单行注释和多行注释。

   (1)单行注释:

使用##符号作为单行语句的注释符,写在需要注释的行或语句的后面。

   (2)多行注释:

使用/*和*/括起来可以连续书写多行注释语句。

       3.重置命令结束标记

 在MySQL中,服务器处理的语句式以分号为结束标记的。但在创建存储函数,存储过程时,在函数体或存储过程体中可以包含多个SQL语句,每个SQL语句都是以分号结尾,而服务器处理程序时遇到第一个分号则结束程序的执行,这时就需要使用DELIMITER语句将MySQL语句的结束标记修改为其他符号。

  语句格式:

 

DELIMITER 符号

 示例:

DELIMITER @@
SELECT *FROM emp@@DELIMITER ;
SELECT * FROM emp;

     恢复使用分号作为结束标记,执行“DELIMITER;”即可。

二、存储函数:

       用户在编写程序的过程中,不仅可以调用系统函数,也可以根据应用程序的需要创建存储函数。

       存储函数是类似于存储过程的一种程序单元,但它的返回值必须是一个单一的值,通常用于计算和返回某些值。存储函数可以用在 SQL 语句中,作为一个表达式。

存储函数的特点:
  • 必须返回一个值:存储函数必须有一个 RETURN 语句来返回一个值。
  • 可以作为表达式使用:存储函数可以嵌入到 SQL 语句中,例如在 SELECT 语句中作为计算的一部分。
  • 不能执行多个 SQL 语句:与存储过程不同,存储函数通常只能执行单一的操作,并返回一个结果,不能像存储过程一样返回多个结果集。

 

存储函数的定义:

创建存储函数使用 CREATE FUNCTION 语句,语法如下:

DELIMITER $$CREATE FUNCTION function_name (param1 datatype, param2 datatype)
RETURNS return_datatype
DETERMINISTIC
BEGIN-- 计算过程RETURN result;
END $$DELIMITER ;
  • return_datatype 是函数的返回类型。
  • DETERMINISTIC 表示该函数对于相同的输入参数返回相同的结果。如果函数结果依赖于外部因素(如随机数、时间等),则应使用 NOT DETERMINISTIC
  • RETURN result 用于返回结果。
调用存储函数:

存储函数的调用方式可以像普通的表达式一样使用,通常是查询中的一部分。例如:

SELECT function_name(param1_value, param2_value);

示例:

DELIMITER $$CREATE FUNCTION CalculateTax(price DECIMAL(10,2)) 
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGINDECLARE tax DECIMAL(10,2);SET tax = price * 0.1;RETURN tax;
END $$DELIMITER ;

删除存储函数:

DROP FUNCTION NAME_FN;

函数名后面不要加括号

三、存储过程:

  

存储过程是由一组 SQL 语句组成的预编译程序,可以根据需要在数据库中被多次执行。存储过程可以接受参数,也可以返回多个结果集。通常用于执行复杂的业务逻辑,封装一组 SQL 操作或事务。

存储过程的特点:
  • 没有返回值:存储过程不能返回值,但可以使用 OUT 参数来返回值。
  • 支持多个结果集:存储过程可以返回多个查询结果集,可以通过 SELECT 语句来返回数据。
  • 执行方式:存储过程在数据库中创建后,可以通过 CALL 语句执行。
  • 封装复杂逻辑:存储过程非常适合封装一些复杂的查询或事务操作。

    

存储过程的定义:

创建存储过程使用 CREATE PROCEDURE 语句,语法如下:

  

DELIMITER $$CREATE PROCEDURE procedure_name (param1 datatype, param2 datatype)
BEGIN-- SQL语句SELECT * FROM table_name;
END $$DELIMITER ;
  • DELIMITER $$ 是用来修改命令结束符的,通常 MySQL 的默认命令结束符是 ;,但是存储过程体内部也会使用 ; 来分隔 SQL 语句,因此需要使用 DELIMITER 来改变结束符。
  • procedure_name 是存储过程的名字。
  • param1param2 等是存储过程的输入参数,可以指定类型,如 INTVARCHAR 等。

     

调用存储过程:

创建好存储过程后,可以使用 CALL 来调用存储过程:

CALL procedure_name(param1_value, param2_value);

示例:

DELIMITER $$CREATE PROCEDURE GetEmployeeInfo(IN emp_id INT)
BEGINSELECT name, position FROM employees WHERE id = emp_id;
END $$DELIMITER ;

调用:

CALL GetEmployeeInfo(101);

四、两者区别:

存储过程与存储函数的主要区别

特性存储过程(Stored Procedure)存储函数(Stored Function)
返回值没有返回值,通常通过 OUT 参数返回结果。必须有返回值,使用 RETURN 语句返回一个值。
执行的操作可以执行 SELECTINSERTUPDATEDELETE 等操作。只能执行 SELECT 查询,不能修改数据。
调用方式使用 CALL 语句调用存储过程。直接在 SQL 语句中调用,如 SELECT function_name();
使用场景用于需要执行一系列操作的场景,例如批量插入、更新等。用于需要返回单个计算值的场景,例如计算某个值的统计信息。
是否可以嵌套使用可以调用存储过程、存储函数或其他 SQL 语句。可以在 SQL 查询中嵌套调用,但不能直接修改数据。

总结

以上就是我们今天要讲的内容,我简单讲了存储函数和存储过程以及他们的区别,下面我会持续更新数据库的内容的,希望大家多多关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77036.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基础贪心算法集合2(10题)

目录 1.单调递增的数字 2.坏了的计算器 3.合并区间 4.无重叠区间 5. 用最少数量的箭引爆气球 6.整数替换 解法1:模拟记忆化搜索 解法2位运算贪心 7.俄罗斯套娃信封问题 补充.堆箱子 8.可被3整除的最大和 9.距离相等的条形码 10.重构字符串 1.单调递增的数字…

RaabitMQ 快速入门

🎉欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ 🎉感谢各位读者在百忙之中抽出时间来垂阅我的文章,我会尽我所能向的大家分享我的知识和经验📖 🎉希望我们在一篇篇的文章中能够共同进步!!&…

语音识别——根据声波能量、VAD 和 频谱分析实时输出文字

SenseVoiceSmall网络结构图 ASR(语音识别)是将音频信息转化为文字的技术。在实时语音识别中,一个关键问题是:如何决定将采集的音频数据输入大模型的最佳时机?固定时间间隔显然不够灵活,太短可能导致频繁调用模型,太长则会延迟文字输出。有没有更智能的方式?答案是肯定…

AI大模型如何重塑科研范式:从“假说驱动”到“数据涌现”

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:科研进入“模型共研”时代 传统科研范式通常以“假设→实验→验证→理论”的方式推进,这一经典路径建立在人类的认知能力与逻辑推理基础上。然而,随着数据规模的爆炸式增长与知识系统的高度复杂…

使用Python写入JSON、XML和YAML数据到Excel文件

在当今数据驱动的技术生态中,JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体。然而,当需要将这类半结构化数据转化为具备直观可视化、动态计算和协作共享特性的载体时&…

面试题:Eureka和Nocas的区别

Eureka 与 Nacos 核心区别对比 一、功能定位与核心能力 ‌维度‌‌Eureka‌‌Nacos‌‌核心功能‌专注服务注册与发现,无配置管理功能‌:ml-citation{ref“1,3” data“citationList”}集成服务注册、发现、配置管理、动态DNS等‌:ml-citation{ref“1,3” data“c…

2025年4月15日 百度一面 面经

目录 1. 代理相关 从静态代理到动态代理 2. cglib可以代理被final修饰的类吗,为什么 3. JVM 体系结构 4. 垃圾回收算法 5. 什么是注解 如何使用 底层原理 6. synchronized和reentrantlock 7. 讲一下你项目中 redis的分布式锁 与java自带的锁有啥区别 8. post 请求和 ge…

AI改变生活

AI改变生活 人工智能(AI)在我们生活中的应用越来越广泛,深刻地改变了我们的工作和生活方式。以下是一些AI实际应用的实例,以及它们如何影响我们的日常生活。 1. 智能助手 智能助手如Siri、Alexa和Google Assistant等&#xff0…

信奥赛之c++基础(取模运算与数位分离)

🎮 数字拆解大冒险——取模运算与数位分离魔法课 🍬 第一章:糖果分装术——取模运算 🍭 分糖果游戏 7颗糖每人分3颗: 每人得到:7 / 3 = 2颗剩余糖果:7 % 3 = 1颗(%就是取模符号) 就像把糖果装袋后剩下的零散糖粒!🔧 取模运算说明书 算式比喻结果10 % 310颗糖分…

揭秘大数据 | 21、软件定义计算

老夫先将这个小系列的前两篇内容链接奉上,方便感兴趣的朋友一气读之。 揭秘大数据 | 19、软件定义的世界-CSDN博客 揭秘大数据 | 20、软件定义数据中心-CSDN博客 今天,书接上文,开聊软件定义计算的那些事儿! 虚拟化是软件定义…

FPGA-DDS技术的波形发生器

1.实验目的 1.1掌握直接数字频率合成(DDS)的基本原理及其实现方法。 1.2在DE2-115 FPGA开发板上设计一个可调频率的正弦波和方波发生器,频率范围10Hz~5MHz,最小分辨率小于1kHz。 1.3使用Quartus II进行仿真,并通过S…

LeetCode[541]反转字符串Ⅱ

思路: 题目给我们加了几个规则,剩余长度小于2k,大于等于k就反转k个,小于k就全部反转,我们按照这个逻辑来就行。 第一就是大于等于k就反转k个,我们for循环肯定是i2k了,接下来就是判断是否大于等于…

实现定长的内存池

池化技术 所谓的池化技术,就是程序预先向系统申请过量的资源,然后自己管理起来,以备不时之需。这个操作的价值就是,如果申请与释放资源的开销较大,提前申请资源并在使用后并不释放而是重复利用,能够提高程序…

路由器原理与配置技术详解

一、路由基础原理 1.1 路由器的核心功能 网络层设备:工作在OSI参考模型第三层,实现不同网络间的互联互通智能路径选择:基于路由表为数据包选择最优传输路径协议转换:处理不同网络接口间的协议差异(如以太网与PPP&…

Leetcode 3518. Smallest Palindromic Rearrangement II

Leetcode 3518. Smallest Palindromic Rearrangement II 1. 解题思路2. 代码实现 题目链接:Leetcode 3518. Smallest Palindromic Rearrangement II 1. 解题思路 这一题是题目Leetcode 3517. Smallest Palindromic Rearrangement I的升级版本,其主要的…

大模型——Crawl4AI 中的数据提取策略

大模型——Crawl4AI 中的数据提取策略 在本章中,将详细介绍在 Crawl4AI 中可用的数据提取策略。这些策略包括: LLMExtractionStrategy:用于详细内容提取。JsonCssExtractionStrategy:使用 CSS 选择器进行结构化数据检索。CosineStrategy:基于余弦相似性进行有效的语义分段…

职坐标解码互联网行业转型发展新动能

当前,互联网行业正以前所未有的速度重塑全球产业格局。工信部最新数据显示,我国互联网企业营收连续三年保持双位数增长,其中百强企业在人工智能、物联网等领域的投入强度同比提升40%,展现出强劲的技术引领力。与此同时&#xff0c…

linux多线(进)程编程——(4)进程间的传音术(命名管道)

前言(前情回顾) 进程君(父进程)在开发出匿名管道这门传音术后,解决了和自己孩子(子进程)间的沟通问题,父子关系趋于融洽。和孩子沟通后,进程君发现,自己脱离…

在IDEA里面建立maven项目(便于java web使用)

具体步骤: 第一次有的电脑你再创建项目的时候右下角会提醒你弹窗:让你下载没有的东西 一定要下载!!可能会很慢 运行结果: 因为他是默认的8080端口所以在运行的时候输入的url如下图: 新建了一个controller代…

【13】数据结构之树结构篇章

目录标题 树Tree树的定义树的基本概念树的存储结构双亲表示法孩子表示法孩子兄弟表示法 二叉树二叉树与度不超过2的普通树的不同之处二叉树的基本形态二叉树的分类二叉树的性质 二叉树的顺序存储二叉树的链式存储二叉树的链式存储的结点结构树的遍历先序遍历中序遍历…