【MySQL】提高篇—视图与存储过程:存储过程(Procedure)的创建与调用

在关系数据库中,存储过程(Stored Procedure)是一组预编译的 SQL 语句和可选的控制流语句(如条件语句和循环语句),它们被存储在数据库中并可以被客户端应用程序或数据库用户调用。存储过程可以接受输入参数,返回输出参数,并且可以执行复杂的操作。

存储过程在实际应用中具有重要性,主要体现在以下几个方面:

  1. 提高性能:由于存储过程在数据库中预编译并存储,可以减少网络传输的开销,并提高执行效率。

  2. 封装逻辑:将复杂的业务逻辑封装在存储过程中,可以简化应用程序代码,提高代码的可维护性。

  3. 安全性:通过存储过程,可以限制用户对底层表的直接访问,只允许通过存储过程进行操作,从而增强数据安全性。

  4. 事务控制:存储过程可以包含事务控制语句,使得在执行多个操作时可以保证数据的一致性和完整性。

存储过程的创建与调用

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

CREATE PROCEDURE procedure_name (parameters)
BEGIN-- SQL statements
END;
示例

假设我们有一个简单的员工表 employees,其结构如下:

CREATE TABLE employees (employee_id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),department VARCHAR(50),salary DECIMAL(10, 2)
);

我们可以插入一些示例数据:

INSERT INTO employees (employee_id, first_name, last_name, department, salary) VALUES
(1, 'John', 'Doe', 'Engineering', 75000),
(2, 'Jane', 'Smith', 'Marketing', 60000),
(3, 'Alice', 'Johnson', 'Engineering', 80000),
(4, 'Bob', 'Brown', 'Sales', 55000);

创建存储过程

示例 1:创建一个简单的存储过程

我们希望创建一个存储过程,用于插入新员工记录。

-- 创建存储过程
DELIMITER //
CREATE PROCEDURE AddEmployee(IN emp_id INT,IN first_name VARCHAR(50),IN last_name VARCHAR(50),IN department VARCHAR(50),IN salary DECIMAL(10, 2)
)
BEGININSERT INTO employees (employee_id, first_name, last_name, department, salary)VALUES (emp_id, first_name, last_name, department, salary);
END //
DELIMITER ;

解释

  • DELIMITER //:改变语句结束符,避免在存储过程中出现的分号被误认为是语句结束。这里我们使用 // 作为新的结束符。

  • CREATE PROCEDURE AddEmployee(...):定义一个名为 AddEmployee 的存储过程,接收多个输入参数。

  • BEGIN ... END:存储过程的主体,包含要执行的 SQL 语句。

  • INSERT INTO employees ...:将输入参数插入到 employees 表中。

调用存储过程

一旦存储过程被创建,我们可以使用 CALL 语句来调用它。

-- 调用存储过程
CALL AddEmployee(5, 'Charlie', 'Davis', 'HR', 65000);

解释

  • CALL AddEmployee(...):调用名为 AddEmployee 的存储过程,并传递相应的参数。

  • 这个调用将会在 employees 表中插入一条新的员工记录。

查询数据

在调用存储过程后,我们可以查询 employees 表来验证数据是否成功插入。

-- 查询员工表
SELECT * FROM employees;

解释

  • 这个查询将返回 employees 表中的所有记录,包括刚刚插入的员工 Charlie Davis

更新存储过程

我们可以创建一个存储过程来更新员工的薪水。

示例 2:创建更新薪水的存储过程
-- 创建存储过程更新员工薪水
DELIMITER //
CREATE PROCEDURE UpdateEmployeeSalary(IN emp_id INT,IN new_salary DECIMAL(10, 2)
)
BEGINUPDATE employeesSET salary = new_salaryWHERE employee_id = emp_id;
END //
DELIMITER ;

解释

  • CREATE PROCEDURE UpdateEmployeeSalary(...):定义一个名为 UpdateEmployeeSalary 的存储过程,接收员工 ID 和新的薪水作为输入参数。

  • UPDATE employees SET salary = new_salary WHERE employee_id = emp_id;:更新指定员工的薪水。

调用更新存储过程

我们可以调用这个存储过程来更新某个员工的薪水。

-- 调用存储过程更新薪水
CALL UpdateEmployeeSalary(3, 85000);

解释

  • 这个调用将更新员工 ID 为 3 的员工(即 Alice Johnson)的薪水为 85000。

查询更新后的数据

我们可以再次查询 employees 表来验证薪水是否成功更新。

-- 查询员工表
SELECT * FROM employees;

解释

  • 这个查询将返回 employees 表中的所有记录,包括更新后的员工薪水。

删除存储过程

如果不再需要某个存储过程,可以使用 DROP PROCEDURE 命令删除它。

-- 删除存储过程
DROP PROCEDURE AddEmployee;

解释

  • 这个命令将删除名为 AddEmployee 的存储过程,存储过程定义将不再存在。

总结

通过示例能够理解存储过程的创建与调用方法:

  1. 存储过程的定义:存储过程是一组预编译的 SQL 语句,可以封装复杂的逻辑。

  2. 创建存储过程:使用 CREATE PROCEDURE 语句定义存储过程,并使用 DELIMITER 更改语句结束符。

  3. 调用存储过程:使用 CALL 语句来调用存储过程并传递参数。

  4. 更新存储过程:可以创建新的存储过程来执行不同的操作,如更新数据。

  5. 删除存储过程:使用 DROP PROCEDURE 命令删除不再需要的存储过程。

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

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

相关文章

深入了解 Android 中的命名空间:`xmlns:tools` 和其他常见命名空间

在 Android 开发中,xmlns (.xml的namespace)命名空间是一个非常重要的概念。通过引入不同的命名空间,可以使用不同的属性来设计布局、设置工具属性或者支持自定义视图等。除了 xmlns:tools 以外,还有很多常见的命名空间…

Java 线程池:深入理解与高效应用

在 Java 并发编程中,线程池是一种非常重要的技术。它可以有效地管理和复用线程,提高系统的性能和资源利用率。本文将深入探讨 Java 线程池的概念、原理、使用方法以及最佳实践,帮助读者更好地理解和应用线程池。 一、引言 在现代软件开发中&a…

高级SQL技巧掌握

高级SQL技巧掌握 在数据驱动的时代,掌握SQL不仅仅是为了解决具体问题,它更像是一把钥匙,帮助你打开数据分析的大门。你准备好提升你的SQL技能了吗?在这篇文章中,我们将一起探索十个必备的高级SQL查询技巧,这些技巧将帮助你更有效率地进行数据处理与分析。 1. 常见表表达…

从0到1学习node.js(npm)

文章目录 一、NPM的生产环境与开发环境二、全局安装三、npm安装指定版本的包四、删除包 五、用npm发布一个包六、修改和删除npm包1、修改2、删除 一、NPM的生产环境与开发环境 类型命令补充生产依赖npm i -S uniq-S 等效于 --save -S是默认选项npm i -save uniq包的信息保存在…

webpack 老项目升级记录:从 node-sass 限制的的 node v8 提升至支持 ^node v22

老项目简介 技术框架 vue 2.5.17webpack 4.16.5"webpack-cli": "3.1.0""node-sass": "^4.7.2" 几个阶段 第一步:vue2 升级到最新 第一步:升级 vue2 至最新版本,截止到目前(2024-10-…

解决RabbitMQ脑裂问题

文章目录 前言一、现象二、解决办法 前言 RabbitMQ脑裂 一、现象 RabbitMQ镜像群出现脑裂现象,各个节点的MQ实例都“各自为政”,数据并不同步。 二、解决办法 # 停止mq sh rabbitmq-server stop_app # 查看mq进程是否存在 ps -ef | grep rabbitmq # …

ATom:加州理工学院化学电离质谱仪(CIT-CIMS)的现场数据,V2版

目录 简介 摘要 代码 引用 网址推荐 知识星球 机器学习 ATom: In Situ Data from Caltech Chemical Ionization Mass Spectrometer (CIT-CIMS), V2 ATom:加州理工学院化学电离质谱仪(CIT-CIMS)的现场数据,V2版 简介 该数…

trueNas 24.10 docker配置文件daemon.json无法修改(重启被覆盖)解决方案

前言 最近听说truenas的24.10版本开放docker容器解决方案放弃了原来难用的k3s,感觉非常巴适,就研究了一下,首先遇到无法迁移老系统应用问题比较好解决,使用sudo登录ssh临时修改daemon.json重启docker后进行docker start 容器即可…

十一、数据库配置

一、Navicat配置 这个软件需要破解 密码是:123456; 新建连接》新建数据库 创建一个表 保存出现名字设置 双击打开 把id设置为自动递增 这里就相当于每一次向数据库添加一个语句,会自动增长id一次 二、数据库的增删改查 1、Vs 建一个控…

Java设计模式之代理模式(二)

一、CGLIB动态代理 JDK动态代理要求被代理的类必须实现接口,有很强的局限性,而CGLIB动态代理则不要求被代理类实现接口。简单的说,CGLIB会让生成的代理类继承被代理类,并在代理类中对代理方法进行强化处理(前置处理、后置处理等)。…

二叉树详解:类型、特性与应用

二叉树详解:类型、特性与应用 二叉树(Binary Tree)是计算机科学和数据结构中的核心构造,广泛用于多种算法和系统的实现。其每个节点最多有两个子节点,即左子节点和右子节点。尽管其结构表面上相对简单,二叉…

在 Gitee 或 GitCode 上克隆 Dify 项目源码并启动 Docker 环境

在 Gitee 或 GitCode 上克隆 Dify 项目源码并启动 Docker 环境 第一步:克隆源码仓库 首先,使用以下命令将项目克隆到本地,确保您已经在 Gitee 或 GitCode 上配置了 SSH 密钥: git clone gitgitcode.com:Mingcai_Xiong/dify-cop…

git的学习之远程进行操作

1.代码托管GitHub:充当中央服务器仓库的角色 2.git远程进行操作 3.配置本地服务器的公钥 4.推送 5.git远程操作 pull .gitignore 6.给命令配置别名 git config --global alias.st status 7.标签管理 git tag -a [name] -m "XXX" [commit_id] 操作标签…

基于Python的自然语言处理系列(46):4-bit LLM 量化与 GPTQ

在本篇文章中,我们将深入探讨如何使用 GPTQ (Generative Pre-trained Quantization) 进行4-bit大语言模型(LLM)的量化。在大规模语言模型训练和推理的背景下,模型的量化不仅能够大大降低计算成本,还能够提高推理速度,因此对构建高…

正则表达式使用举例一(Python下)

目录 1 问题描述2 解决2.1 问题1的解决2.2 问题2的解决 摘要:本文给出了一个在Python语言中利用re包进行正则表达式匹配计算的例子。详细讲述了所写的正则表达式的含义,还对搜索结果对象的span()函数进行运用举例,从而成功提取出原字符串中的…

查找与排序-插入排序

1.直接插入排序的基本思想 假设n个数据元素关键字存储在静态数组a中,则直接插入排序的基本思想可做如下描述: (1)初始有序子序列由一个元素a[0] 组成; (2)从a[1]开始,对于序列中每…

安卓屏幕旋转(TODO)

要对整个安卓系统实现实时旋转,无论设备如何旋转,屏幕始终与设备的物理方向保持一致,涉及到修改 Android 系统级别的显示设置和传感器处理。这种需求不单单在应用层实现,而是需要对 Android 系统的 **frameworks** 和 **display s…

leetcode 75-13 k和数对的最大数目

我的思路 sort函数排序 然后双指针判断 这样时间复杂度nlgn 题解给出了一种空间换时间方法 用哈希表 注意一下写法 现在完全不会这样写 还有就是注意sort函数的代码 怎么写排序也给忘了 sort用的是什么排序方法

自由职业者的一天:作为小游戏开发者的真实工作日记

大家好,我是小蜗牛。 在这个快节奏的数字时代,自由职业者的生活往往充满了挑战与机遇。作为一名微信小游戏开发者,我的日常工作并不像人们想象中的那样充满光鲜亮丽的画面,而是由无数的编码、调试和创意碰撞组成的。今天&#xf…

MySQL 回收表碎片实践教程

前言: 在 MySQL 数据库中,随着数据的增删改操作,表空间可能会出现碎片化,这不仅会占用额外的存储空间,还可能降低表的扫描效率,特别是一些大表,在进行数据清理后会产生大量的碎片。本篇文章我们…