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;