-- 创建存储过程之前需判断该存储过程是否已存在,若存在则删除
DROP PROCEDURE IF EXISTS delBySid;
-- 创建存储过程(参数:数据库名databaseName ,指定某个列的参数值:tenant)
CREATE PROCEDURE delBySid(in databaseName varchar(50), in tenant varchar(50))
BEGIN
-- 定义变量
-- 循环的初始值s
DECLARE s int DEFAULT 0;
-- 表明 tname
DECLARE tname varchar(255);
-- 定义预处理sql语句
DECLARE SQL_FOR_DELETE varchar(500);
-- 定义游标,并将sql结果集赋值到游标中(查询出数据库中含有sid列名的表, 然后根据传入的sid参数删除所有表的数据)
DECLARE report CURSOR FOR SELECT TABLE_NAME FROM information_schema.columns WHERE TABLE_SCHEMA = databaseName AND column_name='sid';
-- 声明当游标遍历完后将标志变量置成某个值
DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
-- 打开游标
OPEN report;
-- 将游标中的值赋值给变量,注意:变量名不要和返回的列名同名,变量顺序要和游标中的sql结果列的顺序一致
FETCH report INTO tname;
-- 当s不等于1,也就是未遍历完时,会一直循环
WHILE s<>1 DO
-- 执行业务逻辑
-- DELETE FROM tname WHERE sid = tenant;
SET SQL_FOR_DELETE = CONCAT("DELETE FROM ",tname," WHERE sid = '",tenant,"'"); -- 拼接查询sql语句
SET @sql = SQL_FOR_DELETE;
PREPARE stmt FROM @sql; -- 预处理动态sql语句
EXECUTE stmt ; -- 执行sql语句
DEALLOCATE PREPARE stmt; -- 释放prepare
-- 当s等于1时表明遍历以完成,退出循环
FETCH report INTO tname;
END WHILE;
-- 关闭游标
CLOSE report;
END
MySQL存储过程, 编写 查询出指定数据库中含有sid列名的表, 然后根据传入的sid参数条件删除所有表中的数据
最新推荐文章于 2023-03-09 14:22:37 发布