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

【SQL】深入理解MySQL存储过程:从入门到实战

一、什么是存储过程(Stored Procedure)

存储过程 是一组预编译的 SQL 语句的集合,存储在数据库服务器端,可以被多次调用。它类似于编程语言中的“函数”或“方法”,可以接收参数、执行逻辑、返回结果。

✅ 优点:

  1. 提高性能:SQL 语句被预编译,执行效率更高。
  2. 减少网络传输:客户端只需调用存储过程名称,无需发送大量 SQL 语句。
  3. 增强安全性:可限制用户直接操作表,通过存储过程控制访问权限。
  4. 代码复用:一次编写,多次调用。
  5. 便于维护:逻辑集中于数据库端,便于统一管理。

❌ 缺点:

  1. 调试困难(相比应用层代码)。
  2. 移植性差(不同数据库语法不兼容)。
  3. 增加数据库服务器负担。

二、存储过程的基本语法

DELIMITER $$CREATE PROCEDURE 存储过程名([参数列表])
BEGIN-- SQL 语句
END $$DELIMITER ;

🔍 说明:

  • DELIMITER $$:修改语句结束符为 $$,避免 ; 提前结束定义。
  • CREATE PROCEDURE:创建存储过程的关键字。
  • BEGIN ... END:定义存储过程的代码块。
  • DELIMITER ;:恢复默认结束符为分号。

三、无参存储过程示例

示例:查询所有学生信息

DELIMITER $$CREATE PROCEDURE GetAllStudents()
BEGINSELECT * FROM student;
END $$DELIMITER ;

调用方式:

CALL GetAllStudents();

✅ 注意:调用时使用 CALL 关键字。


四、带参存储过程

参数类型:

类型说明
IN输入参数(默认),调用时传入值
OUT输出参数,存储过程返回值给调用者
INOUT既可输入又可输出

示例 1:IN 参数 —— 根据 ID 查询学生

DELIMITER $$CREATE PROCEDURE GetStudentById(IN sid INT)
BEGINSELECT * FROM student WHERE id = sid;
END $$DELIMITER ;
调用:
CALL GetStudentById(1);

示例 2:OUT 参数 —— 返回学生总数

DELIMITER $$CREATE PROCEDURE GetStudentCount(OUT total INT)
BEGINSELECT COUNT(*) INTO total FROM student;
END $$DELIMITER ;
调用:
CALL GetStudentCount(@count);
SELECT @count AS 学生总数;

INTO total:将查询结果赋值给 OUT 参数。


示例 3:INOUT 参数 —— 给数值加 10

DELIMITER $$CREATE PROCEDURE AddTen(INOUT num INT)
BEGINSET num = num + 10;
END $$DELIMITER ;
调用:
SET @n = 5;
CALL AddTen(@n);
SELECT @n; -- 输出 15

五、查看与删除存储过程

1. 查看所有存储过程

SHOW PROCEDURE STATUS WHERE db = '数据库名';

2. 查看某个存储过程的定义

SHOW CREATE PROCEDURE 存储过程名;

3. 删除存储过程

DROP PROCEDURE IF EXISTS 存储过程名;

✅ 推荐使用 IF EXISTS 避免报错。


六、注意事项与最佳实践

  1. 命名规范:建议使用 sp_proc_ 前缀,如 sp_GetAllStudents
  2. 参数命名:避免与字段名冲突,可加 p_ 前缀,如 p_id
  3. 错误处理:高级用法中可结合 DECLARE HANDLER 处理异常。
  4. 事务控制:可在存储过程中使用 START TRANSACTIONCOMMITROLLBACK
  5. 调试技巧:使用 SELECT 输出中间变量辅助调试。

七、实际应用场景

场景说明
数据统计每日/每月报表生成
批量操作批量插入、更新、删除
复杂业务逻辑多表关联、条件判断、循环处理
权限隔离只允许调用存储过程,禁止直接访问表

存储过程是数据库编程的重要组成部分,合理使用可显著提升系统性能与安全性。

http://www.xdnf.cn/news/1361971.html

相关文章:

  • Linux / 宝塔面板下 PHP OPcache 完整实践指南
  • 当模型学会集思广益:集成学习的核心原理与多样化协作模式解析
  • 【Hadoop】HDFS 分布式存储系统
  • 数据结构:单链表(详解)
  • Linux-Redis的安装
  • 【Linux】开发工具命令指南:深度解析Vim的使用操作
  • Java项目-苍穹外卖_Day1
  • 计算机毕业设计 java 血液中心服务系统 基于 Java 的血液管理平台Java 开发的血液服务系统
  • 【应急响应工具教程】Unix/Linux 轻量级工具集Busybox
  • 页面中嵌入Coze的Chat SDK
  • (多线程)线程安全和线程不安全 产生的原因 synchronized关键字 synchronized可重入特性死锁 如何避免死锁 内存可见性
  • 前端通过node本地转译rtsp流,配合hls实现浏览
  • Go语言运算符全解析
  • 用 fastmcp 2.0 做一个“短期记忆(Redis)”的 MCP 服务器(Server)+ 一个简单的 Client 例子
  • Java项目-苍穹外卖_Day2
  • Ubuntu24.04配置yolov5
  • 使用 Gemini CLI作为 Claude Code的 subagent
  • 分布式锁设计实战:多级缓存防御设计优化同步性能
  • 《眼科学》10月版面征稿论文速递
  • Nestjs生命周期中全局方法执行顺序
  • 嵌入式开发学习———Linux环境下网络编程学习(六)
  • MySQL 行转列与列转行的实现方式
  • 在新塘SDK下面,有四中文件夹,GCC、IAR、KEIL、和Keil_AC6.这4个工程有什么区别。各自是怎样配置寄存器并实现SPI功能的
  • Aligning Effective Tokens with Video Anomaly in Large Language Models
  • Node.js面试题及详细答案120题(43-55) -- 性能优化与内存管理篇
  • 《飞算Java开发实战:从入门安装到项目部署》
  • 【GEE+Python 实战】用 Sentinel-2 监测 2024 年研究区 NDVI 变化(附完整源码与避坑指南)
  • Codejock Suite ProActiveX COM Crack
  • 一文掌握 Java 键盘输入:从入门到高阶(含完整示例与避坑指南)
  • LIANA | part1 intro部分