msyql定义存储过程存
发表于 2021-1-14 | | 开发笔记

-- 定义存储过程存,删除所有表中逻辑删除的数据

DROP PROCEDURE IF EXISTS delete_data;

CREATE PROCEDURE delete_data()

BEGIN

-- 定于全局变量tableName,就是循环时的表名

DECLARE tableName VARCHAR (40);

-- 定义全局变量sql,就是每次循环执行的sql语句

DECLARE sqls VARCHAR (300);

-- 定于全局变量done,默认为false,如果循环完毕,值变为true

DECLARE done INT DEFAULT FALSE;

-- 定于全局变量,要更新的值

DECLARE val TINYINT(1);



-- 声明游标,游标对应的结果集为查询出的所有符合条件的表名,

-- 下面的select语句为查询表名,其中的TABLE_SCHEMA就是数据库名

DECLARE cursor_name CURSOR FOR

-- 查询指定库表名中包含某字段的表

SELECT TABLE_NAME FROM information_schema.COLUMNS WHERE table_schema = '你的数据库' and COLUMN_NAME='delete_time';

-- 当循环结束后,就把全局变量done设置为true

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

-- 设置更新的值

SET val = 0;

-- 打开游标

OPEN cursor_name;

my_loop:LOOP

-- 游标当前指向的一条数据赋值给tableName

FETCH cursor_name INTO tableName;

-- 修改表的数据的sql

SET sqls = CONCAT('DELETE FROM ', tableName, ' WHERE delete_time > ', val );

-- 把要执行的sql语句赋值给@a变量

SET @a = sqls;

-- 预处理语句

PREPARE stmt1 FROM @a;

-- 执行预处理语句

EXECUTE stmt1;

-- 删除预处理语句

DEALLOCATE PREPARE stmt1;

-- 每次检查done变量,如果为true,就跳出循环

IF done THEN LEAVE my_loop;

END IF;

-- 结束循环

END LOOP;

-- 关闭游标

CLOSE cursor_name;

END;

-- 调用存储过程

CALL delete_data();

发表评论:

TOP