当前位置: 首页 > news >正文

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 查询中嵌套调用,但不能直接修改数据。

总结

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

相关文章:

  • 基于vue2+ElementUI的el-tree封装一个带搜索的树形组件
  • 【差分隐私相关概念】瑞丽差分隐私(RDP)-瑞丽散度约束了贝叶斯因子后验变化
  • 前端与Java后端交互出现跨域问题的14种解决方案
  • 使用 Node.js、Express 和 React 构建强大的 API
  • 4.15【A】pc homework3~
  • python实战案例:玩具销售数据分析
  • Java基础-泛型(泛型擦除)
  • 【redis】初识redis
  • 实验二.单按键控制LED
  • 自定义Jackson序列化和反序列化
  • 家用发电机的原理是什么?
  • 【STM32】在FreeRTOS下使用硬件SPI收发数据出现的时序耦合问题(WK2124芯片为例)
  • 使用 Sass 打造动态星空背景效果
  • 远方游子的归家记:模仿美食网页的制作与实现
  • React JSX?
  • C++红黑树
  • 时间的重构:科技如何重塑人类的时间感知与存在方式
  • 【大模型系列篇】深度研究智能体技术演进:从DeepResearch到DeepResearcher,如何重构AI研究范式
  • 深度访谈:数据中台的本质不是技术堆砌,而是业务引擎的重构
  • c++进阶-继承01
  • 44岁街舞运动推广者、浙江省街舞运动协会常务理事钟永玮离世
  • 8小时《大师与玛格丽特》:长度可以是特点,但不是价值标准
  • 央行行长:未来还可以扩大结构性货币政策工具规模或创设新的政策工具
  • 巴基斯坦所有主要城市宣布进入紧急状态,学校和教育机构停课
  • 青岛鞋企双星名人集团家族内斗:创始人发公开信指控子孙夺权
  • 工人日报关注跟着演出去旅游:票根经济新模式兴起,让过路客变过夜客