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

MySQL存储过程

一、存储过程的核心概念​

  1. ​定义​
    存储过程是一段预编译的SQL代码块,封装复杂逻辑以提高效率和复用性。

  2. ​作用​

    • ​提高性能​​:一次编译多次执行,减少解析开销。
    • ​减少网络流量​​:只需传递过程名和参数,而非多行SQL。
    • ​模块化与复用​​:封装业务逻辑,便于统一维护。
    • ​安全性​​:通过权限控制保护数据。
  3. ​与函数的区别​

    • 函数必须返回单一值,而存储过程可返回多个结果集或通过参数输出。
    • 函数可在SELECT中调用,存储过程需用CALL执行。

​二、存储过程语法详解​

​1. 创建存储过程​
DELIMITER //  -- 避免分号冲突CREATE PROCEDURE procedure_name(IN input_param1 INT,       -- 输入参数OUT output_param2 VARCHAR(50), -- 输出参数INOUT inout_param3 FLOAT  -- 输入输出参数
)
BEGIN-- 逻辑代码
END //DELIMITER ;
​2. 参数类型​
  • ​IN​​(默认):调用者传入值,内部不可修改。
  • ​OUT​​:存储过程返回的结果,初始值为NULL
  • ​INOUT​​:输入并可在过程中修改的值。

​三、流程控制与语法结构​

​1. 变量声明与赋值​
DECLARE var_name INT;           -- 声明变量
SET var_name = 10;              -- 赋值
SELECT column INTO var_name FROM table; -- 查询结果赋值
​2. 条件判断​
  • ​IF语句​

    IF condition THEN...
    ELSEIF condition THEN...
    ELSE...
    END IF;
  • ​CASE语句​

    CASE variableWHEN value1 THEN ...WHEN value2 THEN ...ELSE ...
    END CASE;
​3. 循环​
  • ​WHILE循环​

    WHILE condition DO...
    END WHILE;
  • ​REPEAT循环​

    REPEAT...
    UNTIL condition 
    END REPEAT;
  • ​LOOP循环​

    loop_label: LOOPIF condition THENLEAVE loop_label;  -- 退出循环END IF;
    END LOOP;

​四、实例演示​

​1. 简单查询示例​
-- 创建存储过程:根据ID查询用户名
DELIMITER //
CREATE PROCEDURE GetUserName(IN user_id INT, OUT user_name VARCHAR(50))
BEGINSELECT name INTO user_name FROM users WHERE id = user_id;
END //
DELIMITER ;-- 调用
CALL GetUserName(1, @name);
SELECT @name;
​2. 事务处理示例​
-- 转账存储过程(事务)
DELIMITER //
CREATE PROCEDURE TransferFunds(IN from_acc INT, IN to_acc INT, IN amount DECIMAL(10,2)
)
BEGINDECLARE EXIT HANDLER FOR SQLEXCEPTION BEGINROLLBACK;RESIGNAL;END;START TRANSACTION;UPDATE accounts SET balance = balance - amount WHERE id = from_acc;UPDATE accounts SET balance = balance + amount WHERE id = to_acc;COMMIT;
END //
DELIMITER ;

​五、错误处理​

  • ​定义错误处理器​
    DECLARE handler_action HANDLER FOR condition_value [, ...]statement;-- 示例
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET has_error = 1;

​六、常见操作​

  1. ​查看存储过程​

    SHOW PROCEDURE STATUS;  -- 列出所有存储过程
    SHOW CREATE PROCEDURE procedure_name;  -- 查看定义语句
  2. ​删除存储过程​

    DROP PROCEDURE IF EXISTS procedure_name;

​七、优缺点分析​

  • ​优点​

    • 执行速度快(预编译)。
    • 减少网络通信量。
    • 隐藏业务逻辑,增强安全性。
  • ​缺点​

    • 调试复杂。
    • 增加数据库服务器负载。
    • 维护成本高(需熟悉存储过程语法)。
http://www.xdnf.cn/news/1526.html

相关文章:

  • 初识Redis · 持久化
  • 基于LangChain的RAG召回率增强技术实现:智能分块策略实现、多路召回与重排序实现、异构数据溯源与关联实现
  • Windows上使用Python 3.10结合Appium-实现APP自动化
  • 机器视觉的智能手机屏贴合应用
  • Java单例模式详解:实现线程安全的全局访问点
  • 小白自学python第一天
  • 天梯-这是字符串题
  • Android TV 输入框架(TIF)深度解析与实践指南
  • 2.第二章:政策法规与标准体系
  • 国内外文献免费下载网站
  • Python内置函数---bool()
  • 私有知识库 Coco AI 实战(二):摄入 MongoDB 数据
  • Docker Python 官方镜像使用说明(TAG说明)
  • Playwright自动化测试实战指南-中级部分
  • 聊聊SpringAI流式输出的底层实现?
  • gem5教程第四章 了解gem5统计和输出
  • Elasticsearch 集群节点下线方案
  • 新市场环境下新能源汽车电流传感技术发展前瞻
  • 开源项目实战学习之YOLO11:项目结构及功能分析(一)
  • Shell编程学习笔记1-Shell入门
  • 【漫话机器学习系列】219.支持向量机分类器(Support Vector Classifier)
  • Java并发编程之CompletableFuture原理与实践
  • Linux系统编程 day10 接着线程(中期头大,还要写论文)
  • 钧瓷产业原始创新的许昌共识:技术破壁·产业再造·生态重构(一)
  • C++入门基础知识110—【关于C++嵌套 if 语句】
  • 使用 LangChain 掌握检索增强生成 (RAG) 的终极指南:6、索引
  • Linux:41线程控制lesson29
  • Linux安全防护:全方位服务安全配置指南
  • gem5教程第六章 为ARM扩展gem5 这也是改进gem5的一个基础
  • STM32F103 “BluePill” 上的 DMA 原理与实践