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也不例外。十年后,可能会有新的编程语言或平台…

<代码随想录> 算法训练营-2024.12.31

今日专题:单调栈进阶 今日总结:单调栈的代码写起来感觉还是有点难度,这两道题的解题思路也得好好想一想 42. 接雨水 解法一 :双指针法 class Solution:def trap(self, height: List[int]) -> int:#按列计算当前列上可以接多…

C# async和await

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

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

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

next.js实现SSR入门

Next.js 是一个基于 React 的框架,支持服务端渲染(Server-Side Rendering,简称 SSR)和静态站点生成(Static Site Generation,简称 SSG)。SSR 是指在服务端生成 HTML 页面后再发送到浏览器&#…

C++二十三种设计模式之迭代器模式

C二十三种设计模式之迭代器模式 一、组成二、特点三、目的四、缺点五、示例代码 一、组成 抽象聚合类:存储集合元素,声明管理集合元素接口。 具体聚合类:实现管理集合元素接口。 抽象迭代器类:声明访问和遍历聚合类元素的接口。 …

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;原点…

【信息系统项目管理师】高分论文:论信息系统项目的风险管理(人民医院的信息系统)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划风险管理2、项目风险识别3、风险定性分析4、风险定量分析5、制定风险应对6、实施风险应对计划7、监督风险论文 2022年6月,我作为项目经理承担了XX县人民医院的信息系统建设,该项目总投资300万,其…

计算机网络、嵌入式等常见问题简答

1.嵌入式系统中经常要用到无限循环&#xff0c;如何用C编写死循环 答&#xff1a;while(1){}或者for(;;) 2.程序的局部变量存在于哪里&#xff0c;全局变量存在于哪里&#xff0c;动态申请数据存在于哪里。 答&#xff1a;程序的局部变量存在于栈区&#xff1b;全局变量存在…

【socketioxide和axum集成-实现websocket实时通信-Rust点滴】

socketioxide的axum集成 启动socketio依靠examle里的layer使用可变State依靠axum里的example提取client,IP非代理,tcp,socket对方地址代理SocketRef里socket.req_parts. axum的get,or,post,的handle中请求处理中使用emit发送消息.演示几个自己用的 消息处理1 ,消息mess, 通知签…

gitee 使用教程

前言 Gitee 是一个中国的开源代码托管平台&#xff0c;类似于 GitHub&#xff0c;旨在为开发者提供一个高效、稳定、安全的代码管理和协作开发环境。Gitee 支持 Git 协议&#xff0c;可以托管 Git 仓库&#xff0c;进行版本控制、代码协作、项目管理等操作。 1. Gitee 的主要…

linux ubantu重启桌面

在 Ubuntu 系统中&#xff0c;重启桌面环境通常有几种方法&#xff0c;具体取决于你所使用的桌面环境&#xff08;如 GNOME、KDE 等&#xff09;。下面是几种常用的重启桌面的方法&#xff1a; 重启 GNOME 桌面环境 如果你使用的是 GNOME 桌面环境&#xff08;Ubuntu 默认桌面…

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

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

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

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