MySQL:存储函数和存储过程

news2025/4/16 13:16:36

系列文章目录

1.MySQL编程基础

2.程序控制流语句

3.存储过程

4.游标

5.嵌入式SQL


文章目录

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


前言

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


一、程序控制流语句:

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

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

        1.语句块:

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

       

BEGIN
   SQL语句|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
BEGIN
    DECLARE 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)
BEGIN
    SELECT 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.coloradmin.cn/o/2335980.html

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

相关文章

Google-A2A协议全面解析:一文掌握Agent-to-Agent协议的核心与应用

前言: 在当今人工智能技术飞速发展的时代,智能体(Agent)已悄然融入我们生活的各个角落。无论是个人智能助手,还是企业的自动化工具,各类AI代理的应用愈发广泛。但目前这些智能体之间大多处于孤立状态&…

Linux-服务器添加审计日志功能

#查看audit软件是否在运行(状态为active而且为绿色表示已经在运行) systemctl start auditd #如果没有在运行的话,查看是否被系统禁用 (audit为0表示被禁用) cat /proc/cmdline | grep -w "audit=0" #修改/etc/default/grub里面audit=0 改为audit=1 #更新GRUB…

基于机器视觉的多孔零件边缘缺陷检测(源码C++、opencv、凸包、凸缺陷检测)

👑主页:吾名招财 👓简介:工科学硕,研究方向机器视觉,爱好较广泛… ​💫签名:面朝大海,春暖花开! 基于机器视觉的多孔零件边缘缺陷检测(源码C、ope…

如何使用AI辅助开发CSS3 - 通义灵码功能全解析

一、引言 CSS3 作为最新的 CSS 标准,引入了众多新特性,如弹性布局、网格布局等,极大地丰富了网页样式的设计能力。然而,CSS3 的样式规则繁多,记忆所有规则对于开发者来说几乎是不可能的任务。在实际开发中&#xff0c…

MySQL入门:数据表的创建

​今天我们来介绍一下除HTML外的另一种语言:MySQL语言; MySQL:即一种用于管理和处理关系数据库的标准语言。要用于执行查询、更新、管理数据库中的数据以及定义和操作数据库结构。 接下来我会逐一介绍它的作用以及其中数据表,数据…

数据库的基本原则

数据库的核心原则 原子性与持久性:原子性(Atomicity)确保一个事务中的所有操作要么全部完成,要么完全不执行,不会出现部分完成的情况。持久性(Durability)则保证一旦事务提交成功,即…

Rust 中的Relaxed 内存指令重排演示:X=0 Y=0 是怎么出现的?

🔥 Rust 中的内存重排演示:X0 && Y0 是怎么出现的? 在并发编程中,我们经常会听说“内存重排(Memory Reordering)”这个术语,但它似乎总是只出现在理论或者别人口中的幻觉里。本文将通过…

C++进程间通信开发实战:高效解决项目中的IPC问题

C进程间通信开发实战:高效解决项目中的IPC问题 在复杂的软件项目中,进程间通信(Inter-Process Communication, IPC)是实现模块化、提高系统性能与可靠性的关键技术之一。C作为一门高性能的编程语言,广泛应用于需要高效…

FPGA-DDS技术的波形发生器

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

C#实现通过MQTT Broker——EMQX发布订阅消息及其认证、授权的安全配置操作

一、准备内容 MQTT的构成、使用场景、工作原理介绍-CSDN博客文章浏览阅读656次,点赞7次,收藏12次。MQTT(Message Queuing Telemetry Transport)是一种轻量级、基于发布-订阅模式的消息传输协议【适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境】它在物联网应用中…

【双指针】三数之和(medium)

三数之和(medium) 题⽬描述:解法(排序双指针):算法思路:C 算法代码:Java 算法代码:注:数组转列表 题⽬链接:15. 三数之和 题⽬描述: …

【项目管理】第17章 项目干系人管理-- 知识点整理

项目管理-相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 项目管理知识域 知识点: (项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域) 对应:第6章-第19章 第6章 项目管理概论 4分第13章 项目资源管理 3-4分第7章 项目…

视频融合平台EasyCVR可视化AI+视频管理系统,打造轧钢厂智慧安全管理体系

一、背景分析 在轧钢厂,打包机负责线材打包,操作人员需频繁进入内部添加护垫、整理包装、检修调试等。例如,每班产线超过300件,12小时内人员进出打包机区域超过300次。若员工安全意识薄弱、违规操作,未落实安全措施就…

无参数RCE

无参数RCE(Remote Code Execution,远程代码执行) 是一种通过利用目标系统中的漏洞,在不直接传递用户可控参数的情况下,实现远程执行任意代码的攻击技术。与传统的RCE攻击不同,无参数RCE不依赖外部输入参数…

C++ 智能指针底层逻辑揭秘:优化内存管理的核心技术解读

目录 0.为什么需要智能指针? 1.智能指针的使用及原理 RAII: 智能指针的原理: 2.智能指针有哪些? std::auto_ptr std::unique_ptr std::shared_ptr std::weak_ptr 0.为什么需要智能指针? 想要回答这个问题&…

Vue接口平台学习七——接口调试页面请求体

一、实现效果图及简单梳理 请求体部分的左边,展示参数,分text和file类型。 右边部分一个el-upload的上传文件按钮,一个table列表展示,一个显示框,用于预览选择的文件,点击可大图展示。 二、页面内容实现 …

小程序css实现容器内 数据滚动 无缝衔接 点击暂停

<view class"gundongBox"><!-- 滚动展示信息的模块 --><image class"imgWid" :src"imgurlgundong.png" mode"widthFix"></image><view class"gundongView"><view class"container&qu…

【力扣】day1

文章目录 27.移除元素26. 删除有序数组的重复项 27.移除元素 26. 删除有序数组的重复项 我们仔细看一下这两道题的最后的返回值,为什么第一题返回slow 而第二题返回slow1 最后的返回值该如何返回绝对不是凭感觉,我们自己分析一下第一个slow,从0位置开始, 遇到val值就开始和fas…

图像预处理-色彩空间补充,灰度化与二值化

一.图像色彩空间转换 1.1 HSV颜色空间 HSV颜色空间使用色调&#xff08;Hue&#xff09;、饱和度&#xff08;Saturation&#xff09;和亮度&#xff08;Value&#xff09;三个参数来表示颜色 一般对颜色空间的图像进行有效处理都是在HSV空间进行的&#xff0c;然后对于基本…

项目交接时信息遗漏,如何预防

项目交接时&#xff0c;信息遗漏可能导致任务延误、质量下降和团队混乱&#xff0c;因此&#xff0c;建立系统化的交接流程和使用专业的工具是防止信息遗漏的有效策略。交接过程中的信息丢失往往源自沟通不畅、文档不完整或者责任不明确等问题&#xff0c;这不仅影响项目的顺利…