当前位置: 首页 > 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.dtcms.com/a/349666.html

相关文章:

  • CUDA 工具包 13.0 正式发布:开启新一代 GPU 计算的基石!
  • 使用EasyExcel根据模板导出文件
  • QtExcel/QXlsx
  • 深入浅出 Java 多态:从原理到实践的全面解析
  • 【RAGFlow代码详解-5】配置系统
  • 基于深度学习的翻拍照片去摩尔纹在线系统设计与实现
  • UE5 HoudiniPivotPainter1.0使用
  • NFC 滤波网络设计考虑
  • 车载通信架构---通过CANoe做 SOME/IP 模拟的配置例如
  • 库存指标怎么算?一文讲清3大库存分析指标
  • 大数据治理域——离线数据开发
  • 小白成长之路-k8s部署项目(二)
  • Legion Y7000P IRX9 DriveList
  • 【数据可视化-100】使用 Pyecharts 绘制人口迁徙图:步骤与数据组织形式
  • 程序设计---状态机
  • KVM 虚拟化技术与部署
  • ZKmall开源商城多端兼容实践:鸿蒙、iOS、安卓全平台适配的技术路径
  • 朴素贝叶斯学习笔记
  • Selenium框架Java实践截图服务
  • 面向过程与面向对象
  • 了解检验和
  • 四,设计模式-原型模式
  • 设计模式5-代理模式
  • 无锁队列的设计与实现
  • jdbc相关内容
  • 基于TimeMixer的帕金森语音分类:WAV音频输入与训练全流程
  • 基于开源 AI 智能名片链动 2+1 模式 S2B2C 商城小程序的新开非连锁品牌店开业引流策略研究
  • 云计算之中间件与数据库
  • 蜂窝物联网模组在冷链运输行业的应用价值
  • 盲盒经济新风口:盲盒抽谷机小程序系统开发全解析