sql存储过程

sql存储结构就是将sql语句提前写好、编译好的一段函数,当后面需要用时就不用反复编写长的sql语句。

1、基本格式:

sql 复制代码
-- 先修改结束符
DELIMITER // --编写中有很多的分号,避免读取到;后停止执行,将结束符号换为//

CREATE PROCEDURE 存储过程名(
    -- 参数列表:IN 输入, OUT 输出, INOUT 输入输出
    IN  参数1  数据类型,
    OUT 参数2  数据类型,
    INOUT 参数3 数据类型
)
BEGIN
    -- 声明局部变量
    DECLARE 变量1 数据类型 [DEFAULT 默认值];
    DECLARE 变量2 数据类型;

    -- 赋值
    SET 变量1 = 值;

    -- 执行业务SQL
    SELECT 字段 INTO 变量 FROM 表 WHERE 条件;

    -- 条件判断
    IF 条件 THEN
        语句;
    ELSEIF 条件 THEN
        语句;
    ELSE
        语句;
    END IF;

    -- 循环
    WHILE 条件 DO
        语句;
    END WHILE;

    -- 事务
    START TRANSACTION;
    -- 增删改语句
    COMMIT;
END //
-- 改回默认结束符
DELIMITER ;


CREATE PROCEDURE proc_user_operate(
    IN  p_user_id INT,
    OUT p_user_name VARCHAR(50),
    INOUT p_status INT
)
BEGIN
    -- 声明局部变量
    DECLARE v_age INT DEFAULT 0;
    DECLARE v_count INT;

    -- 赋值
    SET v_count = 0;

    -- 执行业务SQL
    SELECT name, age INTO p_user_name, v_age FROM user WHERE id = p_user_id;

    -- 条件判断
    IF v_age >= 18 THEN
        SET p_status = 1;
    ELSEIF v_age BETWEEN 12 AND 17 THEN
        SET p_status = 2;
    ELSE
        SET p_status = 3;
    END IF;

    -- 循环
    WHILE v_count < 3 DO
        SET v_count = v_count + 1;
    END WHILE;

    -- 事务
    START TRANSACTION;
        UPDATE user SET status = p_status WHERE id = p_user_id;
    COMMIT;

END //
DELIMITER ;


//调用
-- 定义 INOUT 变量
SET @status = 0;

-- 调用存储过程
CALL proc_user_operate(1, @user_name, @status);

-- 查看结果
SELECT @user_name, @status;

注意:

OUT 参数一开始是 NULL,不要在存储过程里直接使用 OUT 参数做计算因为它一开始没有值

2、调用

sql 复制代码
-- 调用
CALL 存储过程名(参数1, @输出参数, 参数3);

-- 查看输出参数
SELECT @输出参数;

3、删除

sql 复制代码
DROP PROCEDURE IF EXISTS 存储过程名;

4、事务

不添加异常处理,直接开启事务的话,如果执行过程中出错,数据库不会回滚,会将事务挂起。

sql 复制代码
--一般写在声明局部变量后
--异常处理:出错就回滚,并返回错误信息
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
        SET p_msg = CONCAT('执行失败,用户ID:', p_user_id);
    END;

--  开启事务
    START TRANSACTION;
相关推荐
云小逸16 小时前
【C++ 第七阶段:模板、泛型编程与工程综合详解】
开发语言·c++
z1234567898617 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD17 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
GIS阵地17 小时前
QgsSingleBandPseudoColorRenderer 完整详解(QGIS 3.40.13 C++)
开发语言·前端·c++·qt·qgis
yaoxin52112318 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
groundhappy18 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
做个文艺程序员18 小时前
Linux第24篇:Java应用监控体系搭建:Prometheus+Grafana可视化运维
java·grafana·prometheus
TlSfoward18 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记18 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘
LabVIEW开发18 小时前
NI Package Manager安装LabVIEW时InternalServerError错误
网络·数据库·labview·labview知识·labview功能·labview程序