MYSQL--------什么是存储过程和函数

什么是存储过程和函数

  • 存储过程

    • 存储过程是一组预编译的 SQL 语句集合,存储在数据库服务器中,可通过名称调用执行。它可以包含数据操作语言(DML)、数据定义语言(DDL)、控制流语句等。存储过程主要用于执行特定任务,如数据的批量插入、更新或复杂的业务逻辑处理,可接受参数,但不直接返回结果,而是通过 OUTINOUT 参数将结果传递出去。
    • 存储过程可视为一个数据库操作的“子程序”,能够封装一系列 SQL 操作,提高代码的重用性和安全性。
  • 函数

    • 函数类似于存储过程,但函数必须返回一个值,且可以在 SQL 语句中使用,如同内置函数一样。函数通常用于执行计算或数据转换,它接受输入参数并返回一个结果,该结果可以在 SQL 语句中被调用处使用。

存储过程和函数的相关操作

创建存储过程
DELIMITER //
CREATE PROCEDURE sp_example(IN param1 INT, OUT param2 VARCHAR(50))
BEGIN-- 声明局部变量DECLARE var1 INT DEFAULT 0;-- 业务逻辑SELECT column1 INTO var1 FROM table1 WHERE column2 = param1;SET param2 = CONCAT('Value is ', var1);
END //
DELIMITER ;

代码解释

  • DELIMITER //:将语句结束符从 ; 改为 //,以便存储过程中的多个语句可以使用 ; 而不被提前结束。
  • CREATE PROCEDURE sp_example(IN param1 INT, OUT param2 VARCHAR(50)):创建名为 sp_example 的存储过程,有一个输入参数 param1 和一个输出参数 param2
  • BEGINEND:存储过程的开始和结束标志。
  • DECLARE var1 INT DEFAULT 0;:声明一个名为 var1 的局部变量并初始化为 0。
  • SELECT column1 INTO var1 FROM table1 WHERE column2 = param1;:将查询结果存储到 var1 中。
  • SET param2 = CONCAT('Value is ', var1);:将结果存储在输出参数 param2 中。
创建函数
DELIMITER //
CREATE FUNCTION fn_example(param1 INT) RETURNS VARCHAR(50)
DETERMINISTIC
BEGINDECLARE result VARCHAR(50);SET result = CONCAT('Input is ', param1);RETURN result;
END //
DELIMITER ;

代码解释

  • DELIMITER //:修改语句结束符。
  • CREATE FUNCTION fn_example(param1 INT) RETURNS VARCHAR(50):创建名为 fn_example 的函数,接受一个输入参数 param1 并返回一个 VARCHAR(50) 类型的值。
  • DETERMINISTIC:表示函数对于相同的输入总是产生相同的输出,这是函数的一个特性声明。
  • DECLARE result VARCHAR(50);:声明一个名为 result 的局部变量。
  • SET result = CONCAT('Input is ', param1);:设置变量的值。
  • RETURN result;:返回结果。

在这里插入图片描述

修改存储过程或函数
  • 对于存储过程:
DELIMITER //
ALTER PROCEDURE sp_example
BEGIN-- 新的逻辑
END //
DELIMITER ;
  • 对于函数:
DELIMITER //
ALTER FUNCTION fn_example RETURNS VARCHAR(50)
DETERMINISTIC
BEGIN-- 新的逻辑
END //
DELIMITER ;

代码解释

  • ALTER PROCEDUREALTER FUNCTION 分别用于修改存储过程和函数的定义。
  • 一般修改存储过程或函数时,需要重新定义其内部逻辑,修改后存储过程或函数的调用方式不变。
删除存储过程或函数
-- 删除存储过程
DROP PROCEDURE IF EXISTS sp_example;
-- 删除函数
DROP FUNCTION IF EXISTS fn_example;

代码解释

  • DROP PROCEDURE IF EXISTS 用于删除存储过程,如果存储过程不存在,使用 IF EXISTS 可避免报错。
  • DROP FUNCTION IF EXISTS 用于删除函数,同理可避免函数不存在时的报错。
查看存储过程或函数
-- 查看存储过程
SHOW PROCEDURE STATUS;
-- 查看函数
SHOW FUNCTION STATUS;
-- 查看存储过程的创建语句
SHOW CREATE PROCEDURE sp_example;
-- 查看函数的创建语句
SHOW CREATE FUNCTION fn_example;

代码解释

  • SHOW PROCEDURE STATUSSHOW FUNCTION STATUS 可以查看存储过程和函数的基本信息,如名称、创建时间等。
  • SHOW CREATE PROCEDURE sp_exampleSHOW CREATE FUNCTION fn_example 可以查看存储过程和函数的详细创建语句,便于检查其定义。

变量的使用

  • 局部变量
DELIMITER //
CREATE PROCEDURE var_example()
BEGINDECLARE local_var INT DEFAULT 0;SET local_var = 10;-- 使用局部变量SELECT local_var;
END //
DELIMITER ;

代码解释

  • DECLARE local_var INT DEFAULT 0;:声明一个名为 local_var 的局部变量并初始化为 0。

  • SET local_var = 10;:设置局部变量的值。

  • 用户变量

SET @user_var = 20;
SELECT @user_var;

代码解释

  • @user_var 是用户变量,可在会话中使用,无需声明,使用 SET 语句赋值。

定义条件和处理

DELIMITER //
CREATE PROCEDURE error_handling()
BEGINDECLARE EXIT HANDLER FOR SQLEXCEPTIONBEGINSELECT 'An error occurred';END;-- 可能引发异常的操作INSERT INTO table1 (column1) VALUES (NULL);
END //
DELIMITER ;

代码解释

  • DECLARE EXIT HANDLER FOR SQLEXCEPTION:定义一个异常处理程序,当发生 SQL 异常时执行后续的代码块。
  • INSERT INTO table1 (column1) VALUES (NULL);:此操作可能引发异常,如 column1 不允许 NULL 值,会触发异常处理程序。

光标的使用

DELIMITER //
CREATE PROCEDURE cursor_example()
BEGINDECLARE done INT DEFAULT FALSE;DECLARE var1 INT;DECLARE cur CURSOR FOR SELECT column1 FROM table1;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;OPEN cur;read_loop: LOOPFETCH cur INTO var1;IF done THENLEAVE read_loop;END IF;-- 处理 var1SELECT var1;END LOOP;CLOSE cur;
END //
DELIMITER ;

代码解释

  • DECLARE cur CURSOR FOR SELECT column1 FROM table1;:声明一个名为 cur 的光标,用于遍历 table1 中的 column1
  • DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;:定义一个处理程序,当光标没有更多数据时设置 doneTRUE
  • OPEN cur;:打开光标。
  • FETCH cur INTO var1;:将光标指向的数据存储到 var1 中。
  • read_loop: LOOPEND LOOP;:定义一个循环,不断读取数据直到 doneTRUE

存储过程和函数在 MySQL
中是强大的工具,可以提高代码的重用性、安全性和性能。通过合理使用变量、条件处理和光标等特性,可以实现复杂的数据库操作和业务逻辑处理。在使用时,要根据具体的业务需求和操作场景选择使用存储过程还是函数,并注意存储过程和函数的区别与联系,以达到最佳的数据库开发和维护效果。

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

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

相关文章

计算机网络 (30)多协议标签交换MPLS

前言 多协议标签交换(Multi-Protocol Label Switching,MPLS)是一种在开放的通信网上利用标签引导数据高速、高效传输的新技术。 一、基本概念 MPLS是一种第三代网络架构技术,旨在提供高速、可靠的IP骨干网络交换。它通过将IP地址映…

探索Facebook的区块链计划:未来社交网络的变革

随着区块链技术的迅速发展,社交网络领域正面临一场深刻的变革。Facebook,作为全球最大且最具影响力的社交平台之一,正在积极探索区块链技术的应用。本文将深入探讨Facebook的区块链计划,分析其潜在的变革性影响,并展望…

十年后LabVIEW编程知识是否会过时?

在考虑LabVIEW编程知识在未来十年内的有效性时,我们可以从几个角度进行分析: ​ 1. 技术发展与软件更新 随着技术的快速发展,许多编程工具和平台不断更新和改进,LabVIEW也不例外。十年后,可能会有新的编程语言或平台…

C# async和await

第一种: 多个异步任务按照顺序执行先让一个异步任务start 然后通过ContinueWith方法 在参数函数的表达式里面开启第二个任务如果要有第三个任务 需要在第二个任务ContinueWith方法中开启第三个任务 以此类推 可以实现多个异步任务顺序执行 上面这种方式绘出现地狱回…

Excel 技巧03 - 如何对齐小数位数? (★)如何去掉小数点?如何不四舍五入去掉小数点?

这几个有点儿关联,我都给放到一起了,不影响大家分别使用。 目录 1,如何对齐小数位数? 2,如何去掉小数点? 3,如何不四舍五入去掉小数点? 1,如何对齐小数位数&#xff…

node.js|浏览器插件|Open-Multiple-URLs的部署和使用,实现一键打开多个URL的强大工具

前言: 在整理各类资源的时候,可能会面临资源非常多的情况,这个时候我们就需要一款能够一键打开多个URL的浏览器插件了 说简单点,其实,迅雷就是这样的,但是迅雷是基于内置nginx浏览器实现的,并…

“AI 视频图像识别系统,开启智能新视界

咱老百姓现在的生活啊,那是越来越离不开高科技了,就说这 AI 视频图像识别系统,听起来挺高大上,实际上已经悄无声息地融入到咱们日常的方方面面,给咱带来了超多便利。 先讲讲安防领域吧,这可是 AI 图像识别的…

C语言 游动的小球

代码如下&#xff1a; 在这里插入代码片#include<stdio.h> #include<stdlib.h> #include<windows.h>int main() {int i,j;int x 5;int y 10;int height 20;int velocity_x 1;int velocity_y 1;int left 0;int right 20;int top 0;int bottom 10;while(1){…

基于SpringBoot实现的保障性住房管理系统

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…

安卓触摸对焦

1. 相机坐标说明 触摸对焦需要通过setFocusAreas()设置对焦区域&#xff0c;而该方法的参数的坐标&#xff0c;与屏幕坐标并不相同&#xff0c;需要做一个转换。 对Camera&#xff08;旧版相机API&#xff09;来说&#xff0c;相机的坐标区域是一个2000*2000&#xff0c;原点…

湖南引力:低代码技术助力军工企业实现设备管理系统创新

背景介绍 在核工业相关生产领域&#xff0c;随着技术的持续进步&#xff0c;生产活动对设备的依赖性日益增强。随着企业规模的不断扩大&#xff0c;所涉及的设备数量和种类也在急剧增长&#xff0c;这使得传统的设备管理模式逐渐显得力不从心。企业当前的设备管理主要依赖人工…

【701. 二叉搜索树中的插入操作 中等】

题目&#xff1a; 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 注意&#xff0c;可能存在多…

VR+智慧消防一体化决策平台

随着科技的飞速发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术与智慧城市建设的结合越来越紧密。在消防安全领域&#xff0c;VR技术的应用不仅能够提升消防训练的效率和安全性&#xff0c;还能在智慧消防一体化决策平台中发挥重要作用。本文将探讨“VR智慧消防一体化…

nginx http反向代理

系统&#xff1a;Ubuntu_24.0.4 1、安装nginx sudo apt-get update sudo apt-get install nginx sudo systemctl start nginx 2、配置nginx.conf文件 /etc/nginx/nginx.conf&#xff0c;但可以在 /etc/nginx/sites-available/ 目录下创建一个新的配置文件&#xff0c;并在…

arcgisPro加载CGCS2000天地图后,如何转成米单位

1、导入加载的天地图影像服务&#xff0c;一开始是经纬度显示的。 2、右键地图&#xff0c;选择需要调整的投影坐标&#xff0c;这里选择坐标如下&#xff1a; 3、点击确定后&#xff0c;就可以调整成米单位的了。 4、切换后结果如下&#xff1a; 如有需要&#xff0c;可调整成…

计算机的错误计算(二百零四)

摘要 利用两个大模型判断&#xff1a;在(0, ) 范围内&#xff0c; 和 等价吗&#xff1f;实验表明&#xff0c;两个大模型&#xff08;其中一个是数学大模型&#xff09;均在输出幻觉&#xff0c;均说等价&#xff01; 例1. 在(0, ) 范围内&#xff0c; 和 等价吗&#xf…

简单的jmeter数据请求学习

简单的jmeter数据请求学习 1.需求 我们的流程服务由原来的workflow-server调用wfms进行了优化&#xff0c;将wfms服务操作并入了workflow-server中&#xff0c;去除了原来的webservice服务调用形式&#xff0c;增加了并发处理&#xff0c;现在想测试模拟一下&#xff0c;在一…

Unity3D仿星露谷物语开发17之空库存栏UI

1、目标 将库存栏放在游戏界面中&#xff0c;一般情况下角色居中展示时库存栏在底部&#xff0c;当角色位于界面下方时库存栏展示在顶部避免遮挡。 2、CanvasGroup组件 用于集中控制UI元素的透明度、交互性和射线投射行为。CanvasGroup的Alpha属性允许渐变效果&#xff0c;I…

现代谱估计的原理及MATLAB仿真(二)(AR模型法、MVDR法、MUSIC法)

现代谱估计的原理及MATLAB仿真AR参数模型法&#xff08;参数模型功率谱估计&#xff09;、MVDR法&#xff08;最小方差无失真响应法&#xff09;、MUSIC法&#xff08;多重信号分类法&#xff09; 文章目录 前言一、AR参数模型1 原理2 MATLAB仿真 二、MVDR法1 原理2 MATLAB仿真…

交换机划分Vlan配置

交换机划分Vlan配置 实验目标 理解虚拟LAN(VLAN)基本配置&#xff1b;掌握一般交换机按端口划分VLAN的配置方法&#xff1b;掌握Tag VLAN配置方法。 实验背景 某一公司内财务部、销售部的PC通过2台交换机实现通信&#xff1b;要求财务部和销售部的PC可以互通&#xff0c;但…